Deveant Posted March 26, 2009 Share Posted March 26, 2009 Im currently just playing around in Java, and am getting annoyed :( what im trying to do, is copy only 50% of the bytes from Src to DstA, then copy the other 50% to DstB. Then concatenate DstA and DstB to recreate the original file. So far no luck... What ive got so far can copy file A -> B, but wont allow me to read Src from given position. Any help would be much appreciated. for my understanding i should be able to be able to give the starting position within the line: MappedByteBuffer buf = in.map(FileChannel.MapMode.READ_ONLY, 0, size); but when ever i dont use 0, i get Caught IOException: Access is denied. import java.io.*; import java.nio.*; import java.nio.channels.FileChannel; public class split { /** Fast & simple file copy. */ public static void copy(File source, File dest) throws IOException { FileChannel in = null, out = null; try { in = new FileInputStream(source).getChannel(); out = new FileOutputStream(dest).getChannel(); long size = in.size(); System.out.println(size); MappedByteBuffer buf = in.map(FileChannel.MapMode.READ_ONLY, 0, size); out.write(buf); } finally { if (in != null) in.close(); if (out != null) out.close(); } } public static void main(String[] args) { try { copy(new File("C:\\hello.txt"), new File("C:\\hel.txt")); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } } } Quote Link to comment Share on other sites More sharing options...
%_% Posted March 26, 2009 Share Posted March 26, 2009 Im currently just playing around in Java, and am getting annoyed :( what im trying to do, is copy only 50% of the bytes from Src to DstA, then copy the other 50% to DstB. Then concatenate DstA and DstB to recreate the original file. So far no luck... What ive got so far can copy file A -> B, but wont allow me to read Src from given position. Any help would be much appreciated. for my understanding i should be able to be able to give the starting position within the line: MappedByteBuffer buf = in.map(FileChannel.MapMode.READ_ONLY, 0, size); but when ever i dont use 0, i get Caught IOException: Access is denied. import java.io.*; import java.nio.*; import java.nio.channels.FileChannel; public class split { /** Fast & simple file copy. */ public static void copy(File source, File dest) throws IOException { FileChannel in = null, out = null; try { in = new FileInputStream(source).getChannel(); out = new FileOutputStream(dest).getChannel(); long size = in.size(); System.out.println(size); MappedByteBuffer buf = in.map(FileChannel.MapMode.READ_ONLY, 0, size); out.write(buf); } finally { if (in != null) in.close(); if (out != null) out.close(); } } public static void main(String[] args) { try { copy(new File("C:\\hello.txt"), new File("C:\\hel.txt")); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } } } Below is a copy of my solution. import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class FileToByteArray { private File file; public FileToByteArray(File file) { this.file = file; } private byte[] firstHalf; private byte[] secondHalf; public byte[] getBytesFromFile() throws IOException { InputStream is = new FileInputStream(file); long length = file.length(); if (length > Integer.MAX_VALUE) { // the file is to large return null; } // Create the byte array to hold the data byte[] bytes = new byte[(int) length]; firstHalf = new byte[(int) length / 2]; secondHalf = new byte[(int) length - firstHalf.length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { throw new IOException("Could not completely read file " + file.getName()); } is.close(); return bytes; } public void splitByteArray(byte[] array) { for (int i = 0; i < array.length; i++) { if (i < firstHalf.length) firstHalf[i] = array[i]; else secondHalf[i - firstHalf.length] = array[i]; } } public void printTwoHalves() { System.out.println("////////FIRST HALF/////////"); for (int i = 0; i < firstHalf.length; i++) { System.out.print((char) firstHalf[i]); } System.out.println(); System.out.println("////////SECOND HALF/////////"); for (int i = 0; i < firstHalf.length; i++) { System.out.print((char) secondHalf[i]); } } public void mergeTwoHalves(byte[] merged) { System.arraycopy(firstHalf, 0, merged, 0, firstHalf.length); System.arraycopy(secondHalf, 0, merged, firstHalf.length, firstHalf.length); System.out.println(); System.out.println("////////MERGED/////////"); for (int i = 0; i < merged.length; i++) { System.out.print((char) merged[i]); } } public static void main(String[] args) { File f = new File("C:/Hello.txt"); FileToByteArray program = new FileToByteArray(f); try { byte[] fileAsByteArray = program.getBytesFromFile(); if (fileAsByteArray == null) return; program.splitByteArray(fileAsByteArray); program.printTwoHalves(); byte[] bytes = new byte[fileAsByteArray.length]; program.mergeTwoHalves(bytes); } catch (IOException e) { e.printStackTrace(); } } } Quote Link to comment Share on other sites More sharing options...
cooper Posted March 27, 2009 Share Posted March 27, 2009 FWIW, the original code snippet works for me. If I set the starting position to something other than 0, I do need to reduce the size by an equal amount for obvious reasons. Failing to do so will result in an 'Invalid argument' IOException. Similarly, if I set position beyond size, the program fails with an 'Invalid argument' IOException. So, not really sure why you get an Access Denied, but I suspect you need to take a closer look at the files you're copying themselves. Quote Link to comment Share on other sites More sharing options...
Deveant Posted March 28, 2009 Author Share Posted March 28, 2009 Thanks Cooper and %_%, i ended up with a solution like %_%'s but as Cooper pointed out, my original code worked -_-' deleted hello.txt and made a new one, worked perfectly as i had planned. Thanks guys. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.