0

私はJAVAの初心者です。これは、このフォーラムでの最初の質問です。プロジェクト用の 16 進エディター ツールを開発しています。その一環として、テキスト ファイルを開いてその内容を読み取り、エディター領域に表示する小さなアプリケーションを作成する必要があります。次に、SHA-256 などの地図作成アルゴリズムを使用して、テキスト ファイル内のテキストのハッシュ値も生成する必要があります。インターネットで非常に役立つコードを見つけました。再利用に努めています。テキスト ファイルの内容をエディターに表示する際に行き詰まりました。コードは次のようになります。

   public Test() throws IOException {

    // passes the number of array elements to the 
    // editor.

    byte[] ar;
    ar = new byte[16 * 16 * 100];
    Arrays.fill(ar, (byte) 0);


    ByteArrayOutputStream bos=new ByteArrayOutputStream();
    ObjectOutputStream oos=new ObjectOutputStream(bos);


    win = new JFrame("Hex Editor");
    win.setSize(654, 473);

    JButton btnOpenFile = new JButton("Open File");
    btnOpenFile.setBounds(67, 38, 91, 23);
    win.getContentPane().add(btnOpenFile);
    btnOpenFile.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            Fileopener opener = new Fileopener();
            //returns the string value through getpause() method.
                            System.out.println(opener.getPause());
        }
    });

oos.writeObject("kirandfasnvcxnz.,mvnmc,xznvmcxzmnvcmxzcccbnxz cz hajk vc jbcvj xbnzvc sbj cvxz,bcxjnzbcvjhs avcjz cxmzncvxz ");
ar=bos.toByteArray();       

fileopener のメソッドを別のクラス ファイルに定義しました。実行中にテキストファイルの内容を返します。私の質問は、テキスト ファイルから読み取られている文字列値をこのメソッドに渡す方法です。エディターに表示されるようにします。

oos.writeObject("kirandfasnvcxnz.,mvnmc,xznvmcxzmnvcmxzcccbnxz cz hajk vc jbcvj xbnzvc sbj cvxz,bcxjnzbcvjhs avcjz cxmzncvxz ");

エディターは、上記のコード行でコンテンツを表示しています。読み取ったテキストの文字列値を返す getter メソッドを呼び出して、それを実行しようとしました。私がこれに使用した方法は

oos.writeObject("Fileopener.getPause()");

テキストファイルの目的のコンテンツが表示されていません。代わりに、エディターはエディター内の中括弧内に関数を表示しています (文字列として読み取られたと思います)。事前にご協力いただきありがとうございます。@sgmorrison 以下は Fileopener() のコードです `

     package hexeditor;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JFileChooser;

public class Fileopener {

    static String pause;

    /**
     * 
     */
    public Fileopener() {
        super();
        // TODO Auto-generated constructor stub

        JFileChooser chooser = new JFileChooser();
        int returnVal = chooser.showOpenDialog(null);

        StringBuffer contents = new StringBuffer();

        BufferedReader inFile = null;

        if (returnVal == JFileChooser.APPROVE_OPTION) {

            File f = chooser.getSelectedFile();

            try {

                inFile = new BufferedReader(new FileReader(f));

                String text = null;

                while ((text = inFile.readLine()) != null) {

                    contents.append(text)

                    .append(System.getProperty(

                    "line.separator"));

                }

            }

            catch (FileNotFoundException e1) {

                e1.printStackTrace();

            } catch (IOException e1) {

                e1.printStackTrace();

            } finally {

                try {

                    if (inFile != null) {

                        inFile.close();

                    }

                } catch (IOException e1) {

                    e1.printStackTrace();

                }

            }

            // show file contents here
            pause = contents.toString();
            setPause(pause);
                   }

    }
         public static String getPause() {
        return pause;
    }

    public void setPause(String pause) {
        this.pause = pause;
    }

}

`

4

1 に答える 1

0

コードが () とまったく同じである場合は、文字列をvalueoos.writeObject("Fileopener.getPause()");に渡しています。でメソッドを呼び出しているのではなく、メソッド呼び出しに少し似た新しい String オブジェクトを作成しています。これが事実であることを確認するには、行を に置き換えてみて、何が起こるかを確認してください。writeObject"Fileopener.getPause()"fileopeneroos.writeObject("Fileopener.getNonExistentMethod()");

この問題を修正するには、呼び出しから引用符を削除します。

oos.writeObject( Fileopener.getPause() );

更新Fileopener のコードを見たので、別の問題である可能性が高いことがわかりました。Fileopener の pause フィールドは として宣言されてstaticいます。これは、プロパティの同じ値がクラスのすべてのインスタンスで使用可能であり、クラス自体のプロパティとしても使用できることを意味します。getPauseも static と宣言されているため、同じ規則が適用されます。

あなたのコメントでは、次のコードについて言及しています。

    Fileopener opener = new Fileopener(); 
    System.out.println(opener.getPause());

新しい Fileopener を作成するpauseと、ファイルの内容を含めるように設定されます。を呼び出さないと設定されませんがnew Fileopener()pauseでアクセスできますgetPause

pauseファイルを読み取ってから の値を読み取るだけでは意味がないため、とstaticから削除することをお勧めします。次に、面倒なコードを次のように変更する必要があります。pausegetPause

    Fileopener opener = new Fileopener(); 
    oos.writeObject(opener.getPause());
于 2012-04-08T20:38:50.343 に答える