2011-01-29 58 views
0
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语句。将多个'if'语句合并到一个outputStream中

程序编译并开始正常运行。它产生几种结果返回从正在读入/再出再次输入2的文件,但随后停止,不会产生更多的成果,给出了错误:

Exception in thread "main" java.io.EOFException at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) at java.io.DataInputStream.readUTF(DataInputStream.java:572) at java.io.DataInputStream.readUTF(DataInputStream.java:547) at YDSearch.listFiles(YDSearch.java:85) at YDSearch.main(YDSearch.java:93)

有人知道为什么这可能发生,并有解决方案他们可以分享 我也试着让变量'b'在if语句内,但由于范围原因不起作用。如果B通过,如果是定义的话,那就只需要一个if语句输出到文件

请让我知道如果你有任何想法,我会很感激:)

+1

您假设文件名中的条目数与找到的.mov和.mp3文件数相同。他们很可能会有所不同。 – 2011-01-29 10:38:52

+0

对不起,这可能只是我愚蠢。是的,它编译得很好,并且在运行时出现错误。我试过改变for循环(String name:filenames){ System.out.println(input2.readUTF()+“\ n”); } 但我不知道我还可以在for()中放置什么? – user585522 2011-01-29 10:42:24

回答

2

由于就我所见,你并不总是为每个名字输出一个输出记录,只是当名称与你的一个模式相匹配时。但是,您确实尝试读取每个名称的输入记录。

Ergo,如果您有任何与您尝试读取的模式不匹配的文件名,那么您将获得EOF。

编辑:

更详细,问题是,你得到所有以“MP3”,“MP4”,“3GP”,“MOV”,“AVI或” WMV结尾的文件的列表“,然后处理该列表,并为每个”mp3“和”mp4“文件写入C:/Users/Jonathan/Desktop/ReadyForAnalysis.dat,然后假定对于文件列表中的每个条目,您将在ReadyForAnalysis.dat中有条目。有任何文件以“3gp”,“mov”,“avi或”wmv“结尾,那么这将不会成立。