1

これは基本的に私がやろうとしていることです。

ファイルを取りたい

それをバイト配列に変換します

それを文字列に変える

MySQLテーブルに保存します

文字列を取得する

それをバイト配列に戻します

それをファイルに戻す

今、私はあなたのためにいくつかのコードを持っています、それは私ができる限りコメントしようとしました。私の問題は、このコードの最後にあるファイルが正しく出力されないことです。情報が不足しています。テキストファイルなので、ファイルが完成しているかどうかがわかるはずです。

私が見る限り、ファイル全体ではなく、ファイルの最後の部分のみを取得しているように見えます。私はこの変換のどこかで何かをひどく台無しにしたと確信しています。この変換と取得をより効率的に行う方法についての提案があれば(データベースとそのすべてを念頭に置いて)、私にも知らせてください!

コードは以下のとおりです

import java.io.*;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

public class main {
    public static void main(String[] args) {
        // The file we want to save.
        File f = new File("build.xml");
        try {
            // Make it into a byte array first
            FileInputStream fis = new FileInputStream(f);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            try {
                for(int readNum; (readNum = fis.read(buf)) != -1;) {
                    bos.write(buf, 0, readNum);
                    System.out.println("read " + readNum + " bytes,");
                }
                StringBuilder s = new StringBuilder();
                // Now we simulate making it into a String, for easier storage
                // in a database.
                for(byte b : buf) {
                    // for debugging
                    s.append(b).append(",");
                    System.out.print(b +",");
                }
                // Now we want to retrieve the file from the database as a string
                File someFile = new File("build2.xml");
                FileOutputStream fos = new FileOutputStream(someFile);
                // We count how many bytes there are in this string.
                // One byte per Token.
                StringTokenizer st = new StringTokenizer(s.toString(),",");
                buf = new byte[st.countTokens()];
                int i = 0;
                StringBuilder t = new StringBuilder();
                // Now we parse out all Bytes from the string, and put them into
                // the prepared byte array.
                while(st.hasMoreTokens()) {
                    byte b = Byte.parseByte(st.nextToken());
                    System.out.print(b + ",");
                    buf[i] = b;
                    i++;
                    // for debugging
                    t.append(b).append(",");
                }
                // Here I print true if both strings are exactly the same
                // which they should be, which means that the bytes are intact
                // before and after conversion.
                System.out.println("\n" +(t.toString().equals(s.toString()) ? true : false));
                // Here we would make the physical file on the machine.
                fos.write(buf);
                fos.flush();
                fos.close();
            } catch (IOException ex) {
                Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

http://pastebin.com/699yuE8f

4

3 に答える 3

2

あなたのアプローチはエンコーディングを完全に無視していますが、これは良いことではありません。文字はバイト以上ではありません。

説明した順序でそれを行う必要がある場合は、次のような方法で文字列を作成します。

String intermediateString = new String(theByteArray,
                                       theSameEncodingTheFileWasCreatedWith);

同様に、文字列をバイトに戻す場合は、次のようにバイトを取得します。

byte[] bytesToSave = intermediateString.getBytes(theSameEncodingTheFileWasCreatedWith);

しかし、それ以外に、文字列を使用する意味は何ですか?バイトをデータベースに直接保存しないのはなぜですか?

于 2012-05-17T16:38:37.667 に答える
1

あなたは単に文字列の作成を台無しにしました、そしてあなたはしかしを読みませbosbuf

            for(byte b : >>buf<<) {
                // for debugging
                s.append(b).append(",");
                System.out.print(b +",");
            }

そうでなければ、私はそれがうまくいくか、それが良い解決策であると確信していません。単純にデータベースに保存できないのはなぜですか?

于 2012-05-17T16:35:56.670 に答える
0

あなたが共有したコードは、必要だったので私見より複雑です。

文字列表現のみに関心があるのに、なぜバイトレベルでテキストを読むのですか?

InputStreamReaderを使用してファイルを読み取ることをお勧めします。これにより、キャラクターを直接操作できます。

于 2012-05-17T16:41:09.823 に答える