由于业务需要对python文件进行参数传递,通过下面两个java方法完美解决此问题,我的思路是:首先我要先把上次写的参数删除,第二我要新的参数写到python文件中。
第一个方法解决了删除上次传递的参数问题。
第二个方法解决了参数传递到python文件
/** * @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 { //1、参数校验 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; } //2、创建临时文件 File tempFile = File.createTempFile("sss", ".temp", new File("D:/")); //3、用文件输入流、文件输出流对文件进行操作 FileOutputStream outputStream = new FileOutputStream(tempFile); FileInputStream inputStream = new FileInputStream(tempFile); //在退出JVM退出时自动删除 tempFile.deleteOnExit(); //4、创建RandomAccessFile流 RandomAccessFile rw = new RandomAccessFile(file, "rw"); //文件指定位置到 position rw.seek(position); int tmp; //5、将position位置后的内容写入临时文件 while ((tmp = rw.read()) != -1) { outputStream.write(tmp); } //6、将追加内容 contents 写入 position 位置 rw.seek(position); rw.write(content.getBytes()); //7、将临时文件写回文件,并将创建的流关闭 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(); } }
效果图:
如果要传递多个参数呢?我这里已经实现了,也是通过以上代码进行了一次封装,如果需要可以留言进行探讨。
原文地址:https://www.cnblogs.com/chen-ya-ping/p/10939412.html
时间: 2024-11-12 13:11:29