2017-04-02 70 views
-2

我想問問是否有更好的解決方案,比使用StringBuilder剪切從BufferedWriter方法解析爲文件的字符串的一部分?BufferedWriter添加了太多行?

如果沒有StringBuilder,那麼文件中會有很多字符串,其餘的字符串data-nirvana會發生什麼?

class TaskStartPart { 
    public void calculHash() throws InterruptedException, IOException, NoSuchAlgorithmException { 
    try { 
    DigestInputStream digestInputStream=null ; 
    MessageDigest messageDigest=MessageDigest.getInstance("SHA-512") ; 
    digestInputStream=new DigestInputStream(new TaskPart(new File("C:\\Users\\win7p\\Documents/t")),messageDigest) ; 
    while(digestInputStream.read()>=0) ; 
    for(byte b: messageDigest.digest()) { 
     hexRes2 += String.format("%02x",b); 
    } sb = new StringBuilder(hexRes2); //StringBuilder which adjust the string to be parsed 
    dateiSpeichern(0,0,sb.substring(hexRes2.length() - 128,hexRes2.length())); System.out.println(sb.substring(hexRes2.length() - 128,hexRes2.length())); 
     digestInputStream.close(); 
     } catch (IOException ex) {ex.printStackTrace();}  
    } 
    } 

    class TaskPart extends InputStream { 
    private File mFile ; 
    private List<File> mFiles ; 
    private InputStream mInputStream ; 

    public TaskPart(File file) throws FileNotFoundException { 
    mFile=file ; 
    if(file.isDirectory()) { 
    mFiles=new ArrayList<File>(Arrays.asList(file.listFiles())) ; 
    Collections.sort(mFiles) ; 
    mInputStream=nextInputStream() ; 
    } else { 
    mFiles=new ArrayList<File>() ; 
    mInputStream=new FileInputStream(file) ; 
    } 
    } 

    @Override 
    public int read() throws IOException { 
    int result=mInputStream==null?-1:mInputStream.read() ; 
    if(result<0 && (mInputStream=nextInputStream())!=null) 
    return read() ; 
    else return result ; 
    } 

    protected String getRelativePath(File file) { 
    return file.getAbsolutePath().substring(mFile.getAbsolutePath().length()) ; 
    } 

    protected InputStream nextInputStream() throws FileNotFoundException { 
    if(!mFiles.isEmpty()) { 
    File nextFile=mFiles.remove(0) ; 
    return new SequenceInputStream(
    new ByteArrayInputStream(getRelativePath(nextFile).getBytes()), 
    new TaskPart(nextFile)) ; 
    } 
    else return null ; 
    } 
} 

    private void dateiSpeichern(int i1, int i2, String hexR) throws InterruptedException, IOException { 
    try { 
    String tF = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss").format(new Date().getTime()); 
    try (BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Users\\win7p\\Documents/hashLog.txt", true))) { 
    writer.append(tF); 
    writer.newLine(); 
    writer.append(dtf); 
    writer.newLine(); 
    writer.append("Hash Value: "); 
    writer.append(hexR); //without StringBuilder I would have much //strings added next to eachone line by line 
} //normal here is also a catch code. 
+0

你的標題和你的問題之間的關係究竟是什麼? – EJP

+0

不知何故,爲什麼它寫了這麼多的字符串,如果這可以避免沒有子字符串方法。但似乎子串是短暫而有效的。 –

+0

我無法制作頭部或尾部。它寫的與子串完全沒有關係。 – EJP

回答

1

真的需要一個StringBuilder,因爲你只是一個String加載它,然後你只是它拿出

您可以使用String#substring方法。

在這兩種情況下,垃圾收集都會照顧不可觸及的對象

StringBuilder是爲建築一個String,並且本質上是一個可變字符緩衝區,你使用它的時候,你要變異的String幾次(這不是你的情況)。

+0

謝謝,我沒有注意到子字符串的方法!是的垃圾收集。 –