将从文本文件中读取的字符串传递给java中的writeObject()?

时间:2012-04-08 17:28:43

标签: java string methods objectoutputstream

我是JAVA的初学者。这是我在这个论坛的第一个问题。我正在为一个项目开发一个十六进制编辑工具。作为其中的一部分,我必须创建一个小应用程序,它应该打开一个文本文件并读取它的内容并将其显示在编辑器区域中。然后它还应该使用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;
    }

}

`

1 个答案:

答案 0 :(得分:0)

如果您的代码与写入(oos.writeObject("Fileopener.getPause()");)完全相同,那么您将字符串传递给值为writeObject的{​​{1}}。您没有在"Fileopener.getPause()"上调用方法,而是创建一个看起来有点像方法调用的新String对象。要查看这种情况,请尝试使用fileopener替换该行,看看会发生什么。

要解决此问题,请从通话中删除引号:

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

更新看过Fileopener的代码后,我现在看到可能是另一个问题。 Fileopener的pause字段声明为oos.writeObject( Fileopener.getPause() );,这意味着该属性的相同值可用于该类的所有实例,并且也可作为类本身的属性使用。 static也被声明为静态,因此适用相同的规则。

在评论中,您提到以下代码:

getPause

创建新的Fileopener会导致 Fileopener opener = new Fileopener(); System.out.println(opener.getPause()); 被设置为包含文件内容。如果不调用pausenew Fileopener()永远不会被设置,但您仍然可以使用pause访问它。

由于只有在您阅读完文件后阅读getPause的值才有意义,我建议您从pausestatic删除pause。然后,您必须将麻烦的代码更改为:

getPause