I want to copy a file from network location into my local directory. I have written following code for this, but the problem is, it needs to have a file created first, and then the out stream writes the bytes stream into this file.
What i want is, the precondition to first create file locally should not be there. It should simply copy the network file into the mentioned directory directly, thats it! I'm kind of doing this for the first time.
try {
File srcFile = new File("//network//file//path//here");
File dstFileName = new File("//local//drive//file//path//here");
InputStream in = new FileInputStream(srcFile);
OutputStream out = new FileOutputStream(dstFileName);
byte[] buff = new byte[1024];
int length;
while ((length = in.read(buff)) > 0) {
out.write(buff, 0, length);
}
in.close();
out.close();
} catch (Exception ex) {
ex.printStackTrace();
}
You need to create the file, before you can write to it.
if(!dstFileName.exists()){
dstFileName.createNewFile();
}
If the the path does not exist, you can try to create it first with
dstFileName.getParentFile().mkdirs();
Related
I developed an app where I am backing up and restoring app data. The backup data is stored in .zip format in phone directory. While restoring I am unzipping the file till here everything works fine. But, if the backup contain images as data, while restoring they are not opening in app and giving an error. The code written for unzipping file is written as
public void DBimport(String inFileName) {
opener= new DataBaseOpener(mApp);
final String outFileName = mContext.getDatabasePath(opener.getDatabaseName()).toString();
try {
File dbFile = new File(inFileName);
FileInputStream fis = new FileInputStream(dbFile);
ZipInputStream zipInputStream= new ZipInputStream(fis);
ZipEntry zipEntry= zipInputStream.getNextEntry();
while(zipEntry!=null) {
String fileName=zipEntry.getName();
File newFile= new File(outFileName/* + File.separator + fileName*/);
new File(newFile.getParent()).mkdirs();
// Open the empty db as the output stream
OutputStream output = new FileOutputStream(newFile);
// Transfer bytes from the input file to the output file
byte[] buffer = new byte[1024];
int length;
while ((length = zipInputStream.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
// Close the streams
output.flush();
output.close();
zipEntry=zipInputStream.getNextEntry();
}
zipInputStream.closeEntry();
fis.close();
Toast.makeText(mContext, "Restore Completed", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(mContext, "Unable to Restores. Retry", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
}
May I know where I am going wrong ? and how to resolve this issue. any suggestions will be helpful.
I am trying to transfer a video file from an RPi hotspot to my a directory on my phone over WiFi. I have been able to successfully create a folder in my storage, connect with the RPi server, and receive data. However, the file that appears after being written isn't correct. In fact, when I try to open it, it just opens a separate, unrelated app on my phone. Very weird!
Here is the code in question:
try {
BufferedInputStream myBis = new BufferedInputStream(mySocket.getInputStream());
DataInputStream myDis = new DataInputStream(myBis);
byte[] videoBuffer = new byte[4096*2];
int i = 0;
while (mySocket.getInputStream().read(videoBuffer) != -1) {
Log.d(debugStr, "while loop");
videoBuffer[videoBuffer.length-1-i] = myDis.readByte();
Log.d(debugStr, Arrays.toString(videoBuffer));
i++;
}
Log.d(debugStr, "done with while loop");
// create a File object for the parent directory
File testDirectory = new File(Environment.getExternalStorageDirectory()+File.separator, "recordFolder");
Log.d(debugStr, "path made?");
if(!testDirectory.exists()){
testDirectory.mkdirs();
}
Log.d(debugStr, "directory made");
// create a File object for the output file
File outputFile = new File(testDirectory.getPath(), "recording1");
Log.d(debugStr, "outputfile made");
// now attach the OutputStream to the file object, i
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
Log.d(debugStr, "write to file object made");
fileOutputStream.write(videoBuffer);
Log.d(debugStr, "video written");
fileOutputStream.close();
Log.d(debugStr, "done");
} catch (IOException e1) {
e1.printStackTrace();
}
The video is initially in .h264 format and is being sent as a byte array. The file is 10MB in size. In my while loop, I print out the value of the array as a string, and it prints a lot of data. Enough data for me to suspect that all the data is being sent. When I navigate to the folder it should be in, there is a file with the name I gave it, "recording1", but it is only 8KB in size.
Any ideas on what is going on? Any help is greatly appreciated!
Android FileOutputStream seems to fail
No it doesn't. Your code seems to fail. That's because your code makes no sense. You're throwing away large chunks of data, more or less accumulating only 1 out of every 8192 bytes; you're using both buffered and unbuffered reads; you're limiting the input to 8192 bytes; and you're never closing the input. And if the input is larger than 8192*8193 you can get an ArrayIndexOutOfBoundsException.
Throw it all away and use this:
try {
File testDirectory = new File(Environment.getExternalStorageDirectory()+File.separator, "recordFolder");
if(!testDirectory.exists()){
testDirectory.mkdirs();
}
File outputFile = new File(testDirectory, "recording1");
try (OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile));
BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream())) {
byte[] buffer = new byte[8192]; // or more, whatever you like > 0
int count;
// Canonical Java copy loop
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
During the execution of my program it creates a directory which contains two sub-directories/two folders. Into one of these folders I need to copy a Jar-File. My programm resembles an installation routine. The copying of the Jar file is not the problem here, but the permissions of the created directories.
I tried to set the permissions of the directories (before actually creating them with the mkdirs() method) with File.setWritable(true, false) and also with the .setExecutable and .setReadable methods, but the access to the sub-directories is still denied.
Here's an excerpt of my code for the creation of one of the two sub-directories:
folderfile = new File("my/path/to/directory");
folderfile.setExecutable(true, false);
folderfile.setReadable(true, false);
folderfile.setWritable(true, false);
result = folderfile.mkdirs();
if (result) {
System.out.println("Folder created.");
}else {
JOptionPane.showMessageDialog(chooser, "Error");
}
File source = new File("src/config/TheJar.jar");
File destination = folderfile;
copyJar(source, destination);
And my "copyJar" method:
private void copyJar(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer))>0) {
os.write(buffer, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
}
is.close();
os.close();
}
At os = new FileOutputStream(dest); the debugger throws a FileNotFoundException with the description that the access to the directory has been denied.
Does anyone have an idea what I am doing wrong or have a better solution for setting the permissions via Java? Thanks in advance!
A similar question was asked there are several years.
A possible solution for Java 7 and Unix system is available here : How do i programmatically change file permissions?
Or, below the best response, a example with JNA.
I hope that that will help you !
I solved the problem. In the end it was much easier to solve than expected.
The main problem was not the permission issue but the FileNotFoundException. The file that is assigned to the OutputStream is not really a file, but just a directory so that the Stream can't find it. You have to create the file before initializing the OutputStream and after that you copy your source file into the newly created file. The code:
private void copyJar(File source, File dest) throws IOException {
InputStream is = null;
File dest2 = new File(dest+"/TheJar.jar");
dest2.createNewFile();
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest2);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer))>0) {
os.write(buffer, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
}
is.close();
os.close();
}
I use Ubuntu 14.04 and am experiencing problems with FileInputStream, FileOutputStream, BufferedReader, and BufferWriter
Here is my project. When I try to copy data from one file to another file there is problem
Code:
try{
File filename=new File(jttex1.getText());
File nfile=new File(jttex2.getText());
if(!filename.exists()){
p("file is not found");
return;
}
if(!nfile.exists()){
p("file is not found");
return;
}
FileInputStream vinput=new FileInputStream(filename);
FileOutputStream voutput=new FileOutputStream(nfile);
jsizee.setText("size"+vinput.available());
byte[] buffer=new byte [50];
int lenghtt=0;
while ((vinput.read(buffer)) > 0);{
voutput.write(buffer);
vinput.close();
voutput.close();
}
}catch(IOException ee){
System.err.println(ee.getMessage());
}
}
There was problem when opening txt file file
"/home/mizzz/netbeansprojects/fold2/fg2.txt" the file you opened has
some invalid characters if you continue this file corrupt this
document you can also choose another character encoding and try again
/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/ 00/00/00/
Your loop is completely wrong. You should read some IO tutorials.
while ((vinput.read(buffer)) > 0);{
voutput.write(buffer);
vinput.close();
voutput.close();}
Should be
int bytes = 0;
while((bytes = vinput.read(buffer)) != -1) {
voutput.write(buffer, 0, bytes);
}
vinput.close();
voutput.close();
No, there are no outstanding problems with Java file I/O on Ubuntu (or other platforms).
The problem is in your code. Just use the copy() method:
Path src = Paths.get(jttex1.getText());
Path dst = Paths.get(jttex2.getText());
jsizee.setText("size: " + Files.size(src));
Files.copy(src, dst);
If you insist on reading all the data into user space (a byte array in your Java code), then you'll need to open and close the files properly. That would look more like this:
Path src = Paths.get(jttex1.getText());
Path dst = Paths.get(jttex2.getText());
try (InputStream is = Files.newInputStream(src)) {
byte[] buffer = new byte[8192];
try (OutputStream os = Files.newOutputStream(dst)) {
while (true) {
int n = is.read(buffer);
if (n < 0)
break;
os.write(buffer, 0, n);
}
}
}
I have developed a java program that copies the file from source folder to destination folder
there are 10 serialized files that it copies from source folder to destination folder
but one thing is missing in it is that let say if the files are already exists in the destination folder then in that case it should not copy
so basically a look is done within in one second that will check the destination folder contain those 10 serialized files or not
if not then in that case only it should copy and after copying it should again check within in second whether file exists or not , Please advise how to achieve this
//Create a class extends with TimerTask
class ScheduledTask extends TimerTask {
public void run() {
InputStream inStream = null;
OutputStream outStream = null;
try {
File source = new File("C:\\cache\\");
File target = new File("C:\\Authclient\\cache\\");
// Already exists. do not copy
/*if (target.exists()) {
return;
}*/
File[] files = source.listFiles();
for (File file : files) {
inStream = new FileInputStream(file);
outStream = new FileOutputStream(target + "/" + file.getName());
byte[] buffer = new byte[1024];
int length;
// copy the file content in bytes
while ((length = inStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}
inStream.close();
outStream.close();
}
System.out.println("File is copied successful!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Copycache {
public static void main(String args[]) throws InterruptedException {
Timer time = new Timer();
ScheduledTask task = new ScheduledTask();
time.schedule(task, new Date(), TimeUnit.SECONDS.toMillis(1));
}
}
the above exists implementation which is commented is not working correct rite now please advise
I am curious about your exact requirements. Consider this small example:
File file = new File("test.txt");
if (!file.exists())
{
FileOutputStream fis = new FileOutputStream(file);
fis.write("blabla".getBytes());
fis.close();
}
Now put a breakpoint on the line FileOutputStream fis...
Run it and wait at the breakpoint, then create the test.txt manually and put some data in it.
Then continue running the program.
Your program will overwrite the contents of test.txt without warning.
If timing is so crucial here you will need to figure out a different solution.
Edit: I got curious and did some more testing. It seems it won't even throw an exception if you add the line file.createNewFile();, break there, create the file and then continue the application. I wonder why..