如何将字符串序列和字节数组写入文件?

时间:2011-03-17 14:44:15

标签: java file-io

我想首先使用Java编写一个字符串序列,然后将一个字节序列写入文件。我开始使用FileOutputStream因为字节数组。在搜索API后,我意识到FileOutputStream无法写String s,只能写int s和byte s,因此我切换到DataOutputStream。当我运行程序时,我得到一个例外。为什么呢?

以下是我的部分代码:

 try {
            // Create the file
            FileOutputStream fos;
            DataOutputStream dos; // = new DataOutputStream("compressedfile.ecs_h");
            File file= new File("C:\\MyFile.txt");
            fos = new FileOutputStream(file);
            dos=new DataOutputStream(fos);

            /* saves the characters as a dictionary into the file before the binary seq*/
            for (int i = 0; i < al.size(); i++) {
                String name= al.get(i).name; //gets the string from a global arraylist, don't pay attention to this!
                dos.writeChars(name); //saving the name in the file
            }

            System.out.println("\nIS SUCCESFULLY WRITTEN INTO FILE! ");

            dos.writeChars("><");
            String strseq;

            /*write all elements from the arraylist into a string variable*/
            strseq= seq.toString();
            System.out.println("sTringSeq: " + strseq);

            /*transpose the sequence string into a byte array*/
            byte[] data = new byte[strseq.length() / 8];

            for (int i = 0; i < data.length; i++) {
                data[i] = (byte) Integer.parseInt(strseq.substring(i * 8, (i + 1) * 8), 2);
                dos.write(data[i]);
            }


            dos.flush();
            //Close the output stream
            dos.close(); 
} catch(Exception e){}

4 个答案:

答案 0 :(得分:0)

行:

data[i] = (byte) Integer.parseInt(strseq.substring(i * 8, (i + 1) * 8), 2);

看起来很可疑......

你能提供关于strseq及其价值的移动细节吗?

答案 1 :(得分:0)

这段代码怎么样?

此代码:


        byte[] data = new byte[strseq.length() / 8];

        for (int i = 0; i < data.length; i++) {
            data[i] = (byte) Integer.parseInt(strseq.substring(i * 8, (i + 1) * 8), 2);
            dos.write(data[i]);
        }

成为


        byte[] data = strseq.getBytes();

答案 2 :(得分:0)

使用FileWriter类,您可以很好地抽象文件写入操作。

这门课可以帮你写文件......

您可以仅使用此类替换其他OutputStream。它具有您在文件中写入字符串和字节数组所需的所有方法。

答案 3 :(得分:0)

你的代码的问题是最后一个for循环计数错误的字节数。下面的代码修复了将测试数据写入文件的问题。这适用于我的机器。

public static void main(String[] args) {

    ArrayList<String> al = new ArrayList<String>();
    al.add("String1");
    al.add("String2");

    try {
        // Create the file
        FileOutputStream fos = new FileOutputStream("MyFile.txt");
        DataOutputStream dos = new DataOutputStream(fos);

        /* saves the characters as a dictionary into the file before the binary seq */
        for (String str : al) {
            dos.writeChars(str);
        }

        System.out.println("\nIS SUCCESFULLY WRITTEN INTO FILE! ");

        dos.writeChars("><");
        String strseq = "001100111100101000101010111010100100111000000000";

        // Ensure that you have a string of the correct size
        if (strseq.length() % 8 != 0) {
            throw new IllegalStateException(
                    "Input String is cannot be converted to bytes - wrong size: "
                            + strseq.length());
        }

        int numBytes = strseq.length() / 8;
        for (int i = 0; i < numBytes; i++) {
            int start = i * 8;
            int end = (i + 1) * 8;
            byte output = (byte) Integer.parseInt(strseq.substring(start, end), 2);
            dos.write(output);
        }

        dos.writeChars("> Enf of File");
        dos.flush();
        // Close the output stream
        dos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

将字节直接写入测试文件的方法确实存在一些问题(我假设它是一个文本文件,因为您的测试文件名以.txt结尾),最明显的一个是某些文本编辑器没有处理/显示空字符非常好(您的最后一个测试字节是:00000000或null)。如果您希望将字节看作可读字节,那么您可以使用Base64编码调查它们的编码。