0

Sender クラスを使用するサーバーと、以下の Downloader クラスを使用するクライアントがあります。クライアントがサーバーに接続すると、database.db と default.docx が完全にダウンロードされますが、.png ファイルの読み取りを開始すると、次のエラーがスローされます。

java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
at java.io.BufferedInputStream.read(BufferedInputStream.java:308)
at java.io.DataInputStream.readFully(DataInputStream.java:178)
at java.io.DataInputStream.readLong(DataInputStream.java:399)
at data.Downloader.<init>(Downloader.java:18)
at data.Connection.<init>(Connection.java:18)
at main(Client.java:17)

ここに私の唯一の2つの方法があります:

ダウンローダ:

public Downloader(Socket socket) {
    try {
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        DataInputStream dis = new DataInputStream(bis);
        int filesCount = dis.readInt();
        for (int i = 0; i < filesCount; i++) {
            long size = dis.readLong();
            String fileName = dis.readUTF();
            System.out.println(fileName);
            if (fileName.equals("database.db")) {
                List<String> data = new ArrayList<String>();
                BufferedReader reader = new BufferedReader(new InputStreamReader(bis));
                String line;
                while ((line = reader.readLine()) != null) {
                    if (line.trim().length() > 0) {
                        data.add(line);
                    }
                }
                reader.close();
                parse(data);
            } else if (fileName.equals("default.docx")) {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                for (int x = 0; x < size; x++) {
                    bos.write(bis.read());
                }
                bos.close();
                document = bos.toByteArray();
            } else if (fileName.contains(".png")) {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                for (int x = 0; x < size; x++) {
                    bos.write(bis.read());
                }
                bos.close();
                Signatures.signatures.add(bos.toByteArray());
            } 
        }
        dis.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

送信者:

public Sender(Socket socket) {
    List<File> files = new ArrayList<File>();
    files.add(new File(Directory.getDataPath("default.docx")));
    files.add(new File(Directory.getDataPath("database.db")));
    for (String signature : Directory.getSignaturePaths()) {
        files.add(new File(signature));
    }
    try {
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        DataOutputStream dos = new DataOutputStream(bos);
        dos.writeInt(files.size());
        for (File file : files) {
            System.out.println(file.getName() + file.length());
            dos.writeLong(file.length());
            dos.writeUTF(file.getName());
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            int theByte = 0;
            while ((theByte = bis.read()) != -1) { 
                bos.write(theByte);
            }
            bis.close();
        }
        dos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

また、 getSignaturePaths() メソッドを確認したところ、正しいパスが返され、.png ファイルが存在します。

4

1 に答える 1

0

ストリームを閉じた後、ソケットを使用し続けました。ソケットの入力ストリームまたは出力ストリームのいずれかを閉じると、もう一方のストリームとソケットが閉じられます。

于 2013-04-03T09:04:53.847 に答える