Processing 无法在导出的处理应用程序中读取和写入同一文件
我正在使用一个外部Processing 无法在导出的处理应用程序中读取和写入同一文件,processing,datastore,Processing,Datastore,我正在使用一个外部.txt文件来保存递增的姓名索引,以备有人在我的应用程序中“拍照”时使用(即image_1.jpg,image_2.jpg,等等)。我正在尝试从外部保存数据,以便用户不会在每次运行程序时覆盖他们的图片。然而,由于处理将其内容打包以供导出的方式,我不能同时读取和写入同一个文件。它读取位于应用程序包内容中的相应文件,但是,当它尝试写入该文件时,它会在与应用程序本身相同的目录中创建一个新文件夹,并改为使用相同名称写入一个新文件 本质上,它读取正确的文件,但拒绝写入,而是复制并写入该文
.txt
文件来保存递增的姓名索引,以备有人在我的应用程序中“拍照”时使用(即image_1.jpg
,image_2.jpg
,等等)。我正在尝试从外部保存数据,以便用户不会在每次运行程序时覆盖他们的图片。然而,由于处理将其内容打包以供导出的方式,我不能同时读取和写入同一个文件。它读取位于应用程序包内容中的相应文件,但是,当它尝试写入该文件时,它会在与应用程序本身相同的目录中创建一个新文件夹,并改为使用相同名称写入一个新文件
本质上,它读取正确的文件,但拒绝写入,而是复制并写入该文件。该应用程序运行正常,但每次打开它并拍照时,都会覆盖已有的图像
我已尝试将“写入”位置命名为与导出的应用程序在包内容中存储数据文件夹的位置明确相同的链接(contents/Resources/Java/data/assets
),但这会在与应用程序相同的文件中创建此目录的副本
我还尝试将读取代码更改为。/storage/pictureNumber.txt
,然后将此文件放在应用程序旁边,从而在导出应用程序时从数据文件夹中排除我试图读取/写入的文件。当我这样做时,应用程序根本不会启动,因为它在自己的数据文件夹中查找存储,并且拒绝使用。/
。是否有人在导出的processing.app中读写同一个文件时运气好
下面是处理文件加载和保存的类的代码:
class Camera {
PImage cameraImage;
int cameraPadding = 10;
int cameraWidth = 60;
int opacity = 0;
int flashDecrementer = 50; //higher number means quicker flash
int pictureName;
Camera() {
String[] pictureIndex = loadStrings("assets/pictureNumber.txt");
pictureName = int(pictureIndex[0]);
cameraImage = loadImage("assets/camera.jpg");
String _pictureName = "" + char(pictureName);
println(pictureName);
}
void display(float mx, float my) {
image(cameraImage, cameraPadding, cameraPadding,
cameraWidth, cameraWidth-cameraWidth/5);
}
boolean isOver(float mx, float my) {
if (mx >= cameraPadding &&
mx <= cameraPadding+cameraWidth &&
my >= cameraPadding &&
my <= cameraPadding+cameraWidth-cameraWidth/5) {
return true;
}
else {
return false;
}
}
void captureImage() {
save("pictures/"+lines.picturePrefix+"_"+pictureName+".jpg");
pictureName++;
String _null = "";
// String _tempPictureName = _null.valueOf(pictureName);
String[] _pictureName = {_null.valueOf(pictureName)};
saveStrings("assets/pictureNumber.txt", _pictureName);
println(_pictureName);
}
void flash() {
fill(255, opacity);
rect(0,0,width,height);
opacity -= flashDecrementer;
if(opacity <= 0) opacity = 0;
}
}
class摄像机{
皮迈格摄影图像;
int=10;
int cameraWidth=60;
int不透明度=0;
int flashDecrementer=50;//数字越大表示快闪
int pictureName;
摄影机(){
String[]pictureIndex=LoadString(“assets/PictureEnumber.txt”);
pictureName=int(pictureIndex[0]);
cameraImage=loadImage(“assets/camera.jpg”);
字符串_pictureName=“”+字符(pictureName);
println(pictureName);
}
无效显示(浮动mx、浮动my){
图像(cameraImage、cameraPadding、cameraPadding、,
cameraWidth,cameraWidth cameraWidth/5);
}
布尔isOver(浮点mx,浮点my){
如果(mx>=cameraPadding&&
mx=cameraPadding&&
my经过大量搜索后,我发现您必须使用savePath()才能从project.jar之外的目录中进行读取
path = savePath("storage");
println(path);
String[] pictureIndex = loadStrings(path+"/pictureNumber.txt");
pictureName = int(pictureIndex[0]);
cameraImage = loadImage("assets/camera.jpg");
String _pictureName = ""+char(pictureName);
而且一切都正常!我无法复制这一点。当我复制你加载和保存的代码部分时,我在应用程序第一次运行时会得到一个空值,然后它会写入资产文件夹中的文件,后续执行会正常运行。你是导出了应用程序还是在处理过程中运行了应用程序?在处理过程中可以正常工作,但在导出应用程序后就不会了ed.它实际上从来没有失败过,它只是覆盖了以前的图像,因为每次导出的应用程序运行时,pictureNumber
都会重置为1。我将其作为一个应用程序进行了尝试。下面是我测试的代码(可能我误解了什么):顺便说一句,您不需要实例化一个String对象来调用valueOf():\u null.valueOf(pictureName)。您可以将其称为String.valueOf(pictureName)-这是一个静态方法。嗯,实际上似乎工作得很好!您知道为什么我的代码表现不一样吗?另外,为什么应用程序在第一次打开时(在f.txt之前)会运行是创建的吗?当我一直试图解决这个问题,并且在没有试图读取的文本文件的情况下运行我的应用程序时,我遇到了一个致命的NullPointerException,应用程序根本无法运行。我不得不使用try and catch。如果我向您发送我正在处理的项目的副本,会有帮助吗?再次感谢您的帮助!