1. 程式人生 > >阿里面試題:FileInputStream 在使用完以後,不關閉流,想二次使用可以怎麼操作

阿里面試題:FileInputStream 在使用完以後,不關閉流,想二次使用可以怎麼操作

FileInputStream 中有一個方法是open 方法呼叫的是本地的開啟檔案的方法,fileinputStream 就是通過這個方法來開啟檔案的,所以如果要重寫讀取這個檔案,不重新建立物件,那麼只要呼叫這個方法就可以了。

  /**
     * Opens the specified file for reading.
     * @param name the name of the file
     */
    private native void open0(String name) throws FileNotFoundException;   
 /**
     * Opens the specified file for reading.
     * @param name the name of the file
     */
    private void open(String name) throws FileNotFoundException {
        open0(name);
    }

所以問題就轉變成呼叫這個方法就行了,這個就不難了。。反射可以輕鬆搞定。下面是我做了一個測試

  @Test
    public void testFileinp() throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        FileInputStream inputStream=new FileInputStream("E:/test/te.txt");
        FileOutputStream outputStream=new FileOutputStream("E:/test/te2.txt");
        FileOutputStream outputStreams=new FileOutputStream("E:/test/te3.txt");
        int len;
        byte [] by=new byte[8192];
        while ((len=inputStream.read(by))!=-1){
            outputStream.write(by,0,len);
        }
        if(inputStream.read()==-1){
            Class in=inputStream.getClass();
            Method openo= in.getDeclaredMethod("open0", String.class);
            openo.setAccessible(true);
            openo.invoke(inputStream,"E:/test/te.txt");
        }
        while ((len=inputStream.read(by))!=-1){
            outputStreams.write(by,0,len);
        }
        outputStream.close();
    }

 

結果當然是在 沒有,關閉流的情況下使用 inputStream 讀了兩遍這個檔案。