因爲業務須要對python文件進行參數傳遞,經過下面兩個java方法完美解決此問題,個人思路是:首先我要先把上次寫的參數刪除,第二我要新的參數寫到python文件中。java
第一個方法解決了刪除上次傳遞的參數問題。python
第二個方法解決了參數傳遞到python文件dom
/** * @param file python文件的路徑 * @return * @throws IOException */ private List<String> readAndRemoveFirstLines(File file) throws IOException{
//刪除第一行內容 int lineNum=1; List<String> strList = new ArrayList<String>(); RandomAccessFile raf = null; try { raf = new RandomAccessFile(file, "rw"); //Initial write position long writePosition = raf.getFilePointer(); for (int i = 0; i < lineNum; i++) { String line = raf.readLine(); if (line == null) { break; } strList.add(line); } // Shift the next lines upwards. long readPosition = raf.getFilePointer(); byte[] buff = new byte[1024]; int n; while (-1 != (n = raf.read(buff))) { raf.seek(writePosition); raf.write(buff, 0, n); readPosition += n; writePosition += n; raf.seek(readPosition); } raf.setLength(writePosition); } catch(IOException e){ throw e; } finally{ try{ if(raf != null){ raf.close(); } }catch(IOException e){ throw e; } } return strList; } /** * @param filePath python文件的路徑 * @param contents 傳入python文件的變量,僅數值便可 * @throws IOException */ public void addContainsToFile(String filePath, String contents) throws IOException { //一、參數校驗 int position =0; File file = new File(filePath); //定義python文件寫入的內容 String content="dis = " + contents + " Meters"+"\n"; //判斷文件是否存在 if (!(file.exists() && file.isFile())) { System.out.println("文件不存在 ~ "); return; } //判斷position是否合法 if ((position < 0) || (position > file.length())) { System.out.println("position不合法 ~ "); return; } //二、建立臨時文件 File tempFile = File.createTempFile("sss", ".temp", new File("D:/")); //三、用文件輸入流、文件輸出流對文件進行操做 FileOutputStream outputStream = new FileOutputStream(tempFile); FileInputStream inputStream = new FileInputStream(tempFile); //在退出JVM退出時自動刪除 tempFile.deleteOnExit(); //四、建立RandomAccessFile流 RandomAccessFile rw = new RandomAccessFile(file, "rw"); //文件指定位置到 position rw.seek(position); int tmp; //五、將position位置後的內容寫入臨時文件 while ((tmp = rw.read()) != -1) { outputStream.write(tmp); } //六、將追加內容 contents 寫入 position 位置 rw.seek(position); rw.write(content.getBytes()); //七、將臨時文件寫回文件,並將建立的流關閉 while ((tmp = inputStream.read()) != -1) { rw.write(tmp); } rw.close(); outputStream.close(); inputStream.close(); }
測試方法我用的Junit進行測試:測試
@Test public void testAddLine() throws IOException { try { //重點注意:1.如下三個方法的執行順序不能改變;2.python文件文件的首行必須添加默認參數dis的數值;3.文件路徑填寫正確 //此方法用來移除python文件中首行內容,在python文件的首行必須添加默認參數dis的數值,如:dis = 200 +'meter' readAndRemoveFirstLines(new File("E:\\demo\\pointbufferandpolygon.py"));//此方法用來給python文件首行添加dis的變量值,注意:變量名在此方法中已寫死,如需修改變量名,參考此方法 addContainsToFile("E:\\demo\\pointbufferandpolygon.py", "90000"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
效果圖:spa
若是要傳遞多個參數呢?我這裏已經實現了,也是經過以上代碼進行了二次封裝,若是須要能夠留言進行探討。pwa