Elizabeth Turner
Elizabeth Turner

Reputation: 2871

How to read a file, reverse the order, and write reverse order

Like a similar project I made, this project is reading characters from a txt file, reversing the order of the string and rewriting it to another txt file. But it keeps outputting my exception of "Something went wrong". Can anyone help me fix what is going wrong?

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class ReverseFile
{
    public static void main(String[] args) throws IOException
       {
          try{
          String source = args[0];
          String target = args[1];

          File sourceFile=new File(source);

          Scanner content=new Scanner(sourceFile);
          PrintWriter pwriter =new PrintWriter(target);

          while(content.hasNextLine())
          {
             String s=content.nextLine();
             StringBuffer buffer = new StringBuffer(s);
             buffer=buffer.reverse();
             String rs=buffer.toString();
             pwriter.println(rs);
          }
          content.close();    
          pwriter.close();
          System.out.println("File is copied successful!");
          }

          catch(Exception e){
              System.out.println("Something went wrong");
          }
       }
}

So here is the information from the stacktrace:

java.lang.ArrayIndexOutOfBoundsException: 0
    at ReverseFile.main(ReverseFile.java:36)

Upvotes: 3

Views: 31270

Answers (5)

Shivam Baghla
Shivam Baghla

Reputation: 21

Here we are reading a file in string variable, then making a String Builder object to perform reverse operation efficiently, then printing

package com;

import java.io.FileReader;

public class Main {
	public static void main(String[] args) {

		try {
			FileReader fr = new FileReader("D:\\newfile.txt");
			String str = "";
			int ch;
            //reading characters in to string variable
			while ((ch = fr.read()) != -1) {
				str += Character.toString((char) ch);
			}
			System.out.println("Original String : " + str);
            //converting string variable to String Builder object
			StringBuilder sb = new StringBuilder(str);
            //reversing the string and printing
			System.out.println("Reverse order : " + sb.reverse());
			fr.close();
		} catch (Exception e) {
			System.out.println("error");
		}
	}
}

Output: enter image description here

Upvotes: 0

PineCone
PineCone

Reputation: 2343

Just thought of a simple approach.

public class ReadFileReverse {

public int[] readByte(File _file) throws IOException {
    FileInputStream source = new FileInputStream(_file);
    int currentByte = source.available();
    int readCount = 0;

    int byteContainer[] = new int[currentByte];
    while(readCount < currentByte){
        byteContainer[readCount] = source.read();
        readCount++;
    }
    source.close();
    return byteContainer;
}

public void printReverse(int[] fileContent){
    for(int byt=fileContent.length -1; byt >= 0 ; byt--){
        System.out.print((char) fileContent[byt]);
    }
}

public static void main(String[] args) throws IOException {
    File fileToRead = new File("/README.txt");

    ReadFileReverse demo = new ReadFileReverse ();
    int[] readBytes = demo.readByte(fileToRead);

    demo.printReverse(readBytes);
}

}

Upvotes: 0

Mrigendra Pratap
Mrigendra Pratap

Reputation: 1

here is ur error free solution to ur problem,u were using "Scanner" without importing "util" package.here we go:-----------

   import java.io.*;
    import java.util.*;

        public class ReverseFile
         {
         public static void main(String[] args) throws IOException
          {
      try{
      File sourceFile=new File(args[0]);
      Scanner content=new Scanner(sourceFile);
      PrintWriter pwriter =new PrintWriter(args[1]);

      while(content.hasNextLine())
      {
         String s=content.nextLine();
         StringBuffer buffer = new StringBuffer(s);
         buffer=buffer.reverse();
         String rs=buffer.toString();
         pwriter.println(rs);
      }
      content.close();    
      pwriter.close();
      System.out.println("File is copied successful!");
      }

      catch(Exception e){
          System.out.println("Something went wrong");
      }
   }
      }

Upvotes: 0

rmalchow
rmalchow

Reputation: 2769

i am not so sure about your environment, and how long the text might be. and i am also not so sure why you need a scanner?

anyway, here's my take on the problem, hope this helps you :)

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;


public class Reverse {

    public static void main(String[] args) {

        FileInputStream fis = null;
        RandomAccessFile raf = null;

        // by default, let's use utf-8
        String characterEncoding = "utf-8";

        // but if you pass an optional 3rd parameter, we use that
        if(args.length==3) {
            characterEncoding = args[2];
        }

        try{

            // input file
            File in = new File(args[0]);
            fis = new FileInputStream(in);

            // a reader, because it respects character encoding etc
            Reader r = new InputStreamReader(fis,characterEncoding);

            // an outputfile 
            File out = new File(args[1]);

            // and a random access file of the same size as the input, so we can write in reverse order 
            raf = new RandomAccessFile(out, "rw");
            raf.setLength(in.length());

            // a buffer for the chars we want to read 
            char[] buff = new char[1];

            // keep track of the current position (we're going backwards, so we start at the end)
            long position = in.length(); 

            // Reader.read will return -1 when it reached the end.
            while((r.read(buff))>-1) {

                // turn the character into bytes according to the character encoding
                Character c = buff[0];
                String s = c+"";
                byte[] bBuff = s.getBytes(characterEncoding);

                // go to the proper position in the random access file
                position = position-bBuff.length;
                raf.seek(position);

                // write one or more bytes for the character
                raf.write(bBuff);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // clean up
            try {
                fis.close();
            } catch (Exception e2) {
            }
            try {
                raf.close();
            } catch (Exception e2) {
            }
        }


    }


}

Upvotes: 3

vidit
vidit

Reputation: 6451

You need to specify the filenames(source and target) on command-line, while running the program.

java ReverseFile source.txt target.txt

In your program, you try to read the name of files from command-line as

String source = args[0];
String target = args[1];

So if you do not specify those names there, java tries to access the array args at index 0 and 1 which are empty and you get ArrayIndexOutOfBoundsException.

Upvotes: 3

Related Questions