Несколько операторов if в одном outputStream - PullRequest
0 голосов
/ 29 января 2011
import java.io.*;
import java.io.File;
import java.io.FilenameFilter;

public class YDSearch{
    public void listFiles(String dir) throws IOException{

    File directory = new File(dir);
    if (!directory.isDirectory()) {
      System.out.println("No directory provided");
      return;
    }
    //create a FilenameFilter and override its accept-method

    FilenameFilter filefilter = new FilenameFilter() {

      public boolean accept(File dir, String name) {
        //if the file extension is .mp3 return true, else false
        return name.endsWith(".mp3")||name.endsWith(".mp4")||name.endsWith(".3gp")
            ||name.endsWith(".mov")||name.endsWith(".avi")||name.endsWith(".wmv");
      }
    };
    String[] filenames = directory.list(filefilter);

    DataOutputStream output = new DataOutputStream(new FileOutputStream("C:/Users/Jonathan/Desktop/YouDetect/SearchByFileType/AllMediaFiles.dat"));

    for (String name : filenames) {
      output.writeUTF(dir + name);
    }
    output.close();

    DataInputStream input = new DataInputStream(new FileInputStream("C:/Users/Jonathan/Desktop/YouDetect/SearchByFileType/AllMediaFiles.dat"));
    DataOutputStream output2 = new DataOutputStream(new FileOutputStream("C:/Users/Jonathan/Desktop/ReadyForAnalysis.dat"));
    for (String name : filenames) {
    FileInputStream in = new FileInputStream(input.readUTF());
        int byteCounter = 0;
        int rowCounter = 0;
        long bufferCounter = 0;
        if(name.endsWith(".mp3")){
            byte[] b = new byte[36];
            int read = in.read(b, 0, 36);
            if (byteCounter != 1000){
                if (rowCounter == 1){
                    System.out.println("\n");
                    rowCounter = 0;
                }
                output2.writeUTF(org.apache.commons.codec.binary.Hex.encodeHexString(b)+ " " + dir + name);
                bufferCounter ++;
                rowCounter ++;
            }else{
                    byteCounter = 0;
                    try{
                        Thread.sleep(200);
                    }catch(InterruptedException e) {
                    }
            }
        }
        else if(name.endsWith(".mp4")){
            byte[] b = new byte[29];
            int read = in.read(b, 0, 29);

            if (byteCounter != 1000){
                if (rowCounter == 1){
                    System.out.println("\n");
                    rowCounter = 0;
                }
                output2.writeUTF(org.apache.commons.codec.binary.Hex.encodeHexString(b)+ " " + dir + name);
                bufferCounter ++;
                rowCounter ++;
            }else{
                    byteCounter = 0;
                    try{
                        Thread.sleep(200);
                    }catch(InterruptedException e) {
                    }
            }
        }
        //System.out.println("====================");
    }
    output2.close();
    input.close();

    DataInputStream input2 = new DataInputStream(new FileInputStream("C:/Users/Jonathan/Desktop/ReadyForAnalysis.dat"));
    for (String name : filenames) {
    System.out.println(input2.readUTF()+"\n");
    }
}
  public void checkHeaderSC(String allFiles)throws IOException{
  }

  public static void main(String[] args) throws IOException {
    YDSearch YDSearch = new YDSearch();
    YDSearch.listFiles("C:/Users/Jonathan/Desktop/YD Tests/1) High Quality/");
    YDSearch.listFiles("C:/Users/Jonathan/Desktop/YD Tests/2) Medium Quality/");
    YDSearch.listFiles("C:/Users/Jonathan/Desktop/YD Tests/3) Low Quality/");
    YDSearch.checkHeaderSC("C:/Users/Jonathan/Desktop/YouDetect/SearchByFileType/ReadyForAnalysis.dat");
  }
}

Привет, у вас небольшая проблема с вышеуказанным кодированием и надеется, что кто-то здесь сможет помочь. Это своего рода частичная версия кода, так как реальная имеет еще 4 оператора if / else if.

Программа компилируется и начинает нормально работать. Он выдает несколько результатов обратно из файла, который читается в / затем снова в input2, но затем останавливается, больше не дает результатов и выдает ошибку:

Исключение в ветке "main" java.io.EOFException в java.io.DataInputStream.readUnsignedShort (DataInputStream.java:323) в java.io.DataInputStream.readUTF (DataInputStream.java:572) в java.io.DataInputStream.readUTF (DataInputStream.java:547) в YDSearch.listFiles (YDSearch.java:85) на YDSearch.main (YDSearch.java:93)

Кто-нибудь знает, почему это может происходить, и есть решение, которым они могли бы поделиться? Я также попытался сделать переменную 'b' внутри оператора if, но это не работает из-за области видимости. Если b было определено с помощью if's, то для вывода в файл необходим только один оператор if

Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи, я бы очень признателен:)

1 Ответ

2 голосов
/ 29 января 2011

Насколько я вижу, вы не всегда выпускаете выходную запись для каждого имени, только для случая, когда имя соответствует одному из ваших шаблонов. Однако вы пытаетесь прочитать входную запись для каждого имени.

Ergo, если у вас есть имена файлов, которые не соответствуют шаблонам, вы пытаетесь прочитать больше, чем пишете, и вы получите EOF.

EDIT:

Более подробно, проблема в том, что вы получаете список всех файлов, которые заканчиваются на "mp3", "mp4", "3gp", "mov", "avi или" wmv ". Затем вы обрабатываете этот список и запишите что-нибудь в C:/Users/Jonathan/Desktop/ReadyForAnalysis.dat для каждого файла "mp3" и "mp4". Затем вы предполагаете, что для каждой записи в вашем списке файлов у вас будет запись в ReadyForAnalysis.dat. Однако, если есть какие-либо файлы, оканчивающиеся на "3gp", "mov", "avi или" wmv ", тогда это не будет иметь место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...