【问题标题】:passing string read from text file to writeObject() in java?将从文本文件中读取的字符串传递给java中的writeObject()?
【发布时间】:2012-04-08 17:28:42
【问题描述】:

我是 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;
    }

}

`

【问题讨论】:

    标签: java string methods objectoutputstream


    【解决方案1】:

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

    要更正此问题,请删除通话中的引号:

    oos.writeObject( Fileopener.getPause() );

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

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

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

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

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

        Fileopener opener = new Fileopener(); 
        oos.writeObject(opener.getPause());
    

    【讨论】:

    • 感谢您的回复。我尝试了你的两个建议,首先是oos.writeObject(Fileopener.getPause());,没有引号,在编辑器中没有显示任何内容。我还尝试了os.writeObject("Fileopener.getNonExistentMethod()");,在这种情况下,结果是创建了新的字符串对象,Fileopener.getNonExistentMethod() 显示在编辑器区域中,而不是显示从文本文件中读取的文本。
    • 如果oos.writeObject(Fileopener.getPause()); 没有显示任何文本,那么Fileopener.getPause() 不会返回任何要显示的文本。尝试检查此方法返回的内容。如果您无法进一步了解,请分享 Fileopener 的代码,以便我们提供更多帮助。
    • 我尝试了包含 System.out.println(Fileopener.getPause());在返回 null 的代码中。当我尝试创建 Fileopener() 的实例时,例如 Fileopener opener = new Fileopener(); System.out.println(opener.getPause());它将从文本文件中读取的文本返回到控制台。我在问题中包含了 Fileopener() 的代码。
    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2016-07-01
    • 2016-07-14
    相关资源
    最近更新 更多