Not able to get output properly aligned - java

List item
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class test104 {
public String[] b=new String[200];
public String flex(String ps) throws IOException
{
String result="";
File file=new File("C:\\ProgramData");
ProcessBuilder pb = new ProcessBuilder("cmd","/C",ps);
pb.directory(file);
Process p = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String readline;
//result=reader.readLine();
int i=0;
result=reader.readLine();
StringBuilder sb = new StringBuilder();
while ((readline = reader.readLine()) != null) {
sb.append(readline);
System.out.println(readline);
b[i]=readline;
i++;
System.out.println("<br>");
}
try {
int exitValue = p.waitFor();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally{
//out.close();
}
return sb.toString();
}}
Print.jsp
</head>
<%# page import="com.test104" %>
<body>
<%
com.test104 f1=new test104();
int j=0;
String k=f1.flex("dir");
String readline;
out.println(k);
%>
The Output is not aligned in straight line. It should come Like one below the other.!
Here is the output in a jsp page.

Code along the lines of
StringBuilder sb = new StringBuilder();
while ((readline = reader.readLine()) != null) {
sb.append(readline);
}
someOutputMethod( sb.toString() );
will remove all line ends from the input read by reader. You must append line ends '\n' after each line or whenever you think necessary.

Related

How can I delete lines of data in textfile using java? eg. my textfile is data.txt

From read the line needed to be deleted by the user to delete it
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Delete {
public static void main(String[] args) throws IOException {
File input = new File("data.txt");
FileReader fr = null;
Scanner ob = new Scanner(System.in);
// declare variable
String DeleteWord, str, newDeleteWord;
System.out.print("Enter word you want to delete: ");
DeleteWord = ob.nextLine();
newDeleteWord = (capitalize(DeleteWord));
try {
fr = new FileReader(input);
BufferedReader br = new BufferedReader(fr);
while ((str = br.readLine()) != null) {
if (str.contains(newDeleteWord)) {
System.out.println(str);
}
Scanner read = new Scanner(System.in);
int selection;
System.out.println("Confirm to delete his/her data?\n 1 for yes\n 2 for no");
selection = read.nextInt();
if (selection == 1)
if (str.contains(newDeleteWord)) {
str = "";
}
}
} finally {
fr.close();
}
}
public static String capitalize(String str1) {
if (str1 == null || str1.isEmpty()) {
return str1;
}
return str1.substring(0, 1).toUpperCase() + str1.substring(1);
}
}
How can I delete lines of data in textfile using java? eg. my textfile is data.txt
This is a possible solution:
File inputFile = new File("myFile.txt"); // File which we will read
File tempFile = new File("myTempFile.txt"); // The temporary file where we will write
BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
String lineToRemove = yourString; // here is your line to remove
String currentLine;
while((currentLine = reader.readLine()) != null) {
String trimmedLine = currentLine.trim(); // we trim it and remove unecessary spaces
if(trimmedLine.equals(lineToRemove)) continue; // If it is equal to our line to remove then do not write it to our file!
writer.write(currentLine + System.getProperty("line.separator"));
}
writer.close();
reader.close();
inputFile.delete(); // we delete the file that we have so that we have no conflicts
boolean successful = tempFile.renameTo(inputFile);
OR
Reading all the lines in a list and filtering this list.
The quickest way is through Apache Commons-IO ( or you can implement it yourself)
Apache Commons:
List<String> lines = FileUtils.readLines(file);
List<String> updatedLines = lines.stream().filter(s -> !s.contains(searchString)).collect(Collectors.toList());
FileUtils.writeLines(file, updatedLines, false);

How to remove garbage values from csv file?

I have a CSV file with some data and it also has a lot of invalid data in it. How can I print only the valid data and leave rest of it?
My data is like this:-
1,Ron,1234,XYZ
2,Harry,214,SDA
3,Kent,1786,GHI
SAMNE:MANNS;ndndo
kdbg;obmgdf;brhj
I want to print only the first 3 lines and remove the last two invalid lines. I am doing this in Eclipse.
You can try something like this.
BufferedReader reader = new BufferedReader(new FileReader(new File("~/input.csv")));
String line;
while((line = reader.readLine())!= null){
try{
int sno = Integer.parseInt( line.split(",")[0]);
System.out.println("Valid "+ line);
//Continue doing more checks or other operations
}catch(NumberFormatException e){
//Skip invalid line
System.out.println("Invalid row "+ line);
}
}
You should check by regex if is valid, throw an exception is a bad idea.
BufferedReader reader = new BufferedReader(new FileReader(new File("~/input.csv")));
String line;
while((line = reader.readLine())!= null){
if(line.matches("(\\d+,\\w+,\\d+,\\w+)"){
print line;
}
}
Something like this:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class JavaApplication1 {
public static void main(String[] args) throws FileNotFoundException, IOException {
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = reader.readLine();
while (line != null) {
String[] part = line.split(",");
try {
Integer.parseInt(part[0]);
System.out.println(line);
} catch (NumberFormatException nfe) {
// This is not a valid line
}
line = reader.readLine();
}
}
}
}

removing extra white spaces from text files

I have number of text files in the following format:
196903274115371008 #266093898
Prince George takes his first public steps with his mom, Catherine, Duchess of
Cambridge.
I would like to remove all extra while spaces + new line characters except the first new line characters. So I would like to above to be like this:
196903274115371008#266093898
Prince George takes his first public steps with his mom, Catherine, Duchess of Cambridge.
I wrote the following code :
package remove_white_space222;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Remove_white_space222 {
public static void main(String[] args) throws FileNotFoundException, IOException {
FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("outfile.txt");
String line;
while((line = br.readLine()) != null)
{
line = line.trim(); // remove leading and trailing whitespace
line=line.replaceAll("\\s+", " ");
fw.write(line);
}
fr.close();
fw.close();
}
}
Thanks in advance for your help,,,,
File file = new File("input_file.txt");
try(BufferedReader br = new BufferedReader(new FileReader(file));
FileWriter fw = new FileWriter("empty_file.txt")) {
String st;
while((st = br.readLine()) != null){
fw.write(st.replaceAll("\\s+", " ").trim().concat("\n"));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Here's one approach:
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("outfile.txt");
String line;
int lineNum = 0;
while((line = br.readLine()) != null)
{
//check if we are working with the first two lines
//(which should remain untouched)
if (lineNum > 1) {
//make sure we ignore any empty lines
if (line.trim().length() > 0) {
//add a space to the end of each line to make
//padding before we append the next line.
line=line.trim().replaceAll("\\s+", " ") + " ";
}
} else {
//remove all whitespace.
line = line.trim().replaceAll("\\s", "");
line = line + "\n";
}
fw.write(line);
lineNum++;
}
fr.close();
fw.close();
}
Output:
196903274115371008#266093898
Prince George takes his first public steps with his mom, Catherine, Duchess of Cambridge. %
You can use status via an enum to add newlines after first line and all empty lines following it.
package remove_white_space222;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter
import java.io.IOException;
public class Remove_white_space222 {
enum Status {
FIRST, EMPTY, NORMAL;
}
public static void main(String[] args) throws FileNotFoundException, IOException {
FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("outfile.txt");
PrintWriter pw = new PrintWriter(fw);
String line;
while((line = br.readLine()) != null)
{
line = line.trim(); // remove leading and trailing whitespace
line=line.replaceAll("\\s+", " ");
fw.write(line);
if (status != Status.NORMAL) {
if ((status == Status.FIRST) || line.isEmpty()) {
pw.println();
status = Status.EMPTY;
} else {
status = Status.NORMAL;
}
}
}
fr.close();
fw.close();
}
}
You can keep your logic for all the lines but line 1 (the 2nd line), just stick "\n\n" in that case, so you have an empty line.
Also, I'd advise to open your resources in the try this way you don't have to worry about closing them
try(FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("outfile.txt") ) {
String line;
int lineNumber = 0;
while((line = br.readLine()) != null) {
if(lineNumber == 1) {
line = "\n\n";
} else {
line = line.trim().replaceAll("\\s+", " ");
}
fw.write(line);
lineNumber++;
}
}
Outputs:
196903274115371008 #266093898
Prince George takes his first public steps with his mom, Catherine, Duchess ofCambridge.

Writing the text from the back

As in the tittle , i want to write my text from back and enter to the text file . In first , i read the text from the text file , next i want to save it in text file , but writing by the end of. I don't have any ideas how to fix my code . My code read the text file , and write the text file , but in the same order , from beginning to ending.
Example how it must work:
input text:
aaaaa
bbbb
ccc
dd
f
output text:
f
dd
ccc
bbbb
aaaaa
My code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class Loading {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader(
"file.txt.txt"));
String line, txt = "";
String[] splittedLine;
while ((line = br.readLine()) != null) {
txt += linia + "\n";
splittedLine = line.split(" ");
}
System.out.println(txt);
br.close();
BufferedWriter bw = new BufferedWriter(new FileWriter("file2"));
bw.write(txt);
bw.newLine();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Read File to String
Write String data to File starting from end.
For lines, use String array to store data from file and then traverse from end to start of array.
Here is complete program.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
public class Loading {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader(
"DB.xml"));
String line, txt = "";
List<String> lines = new ArrayList<String>();
while ((line = br.readLine()) != null) {
lines.add(line);
}
System.out.println(txt);
br.close();
BufferedWriter bw = new BufferedWriter(new FileWriter("file2"));
for(int i=lines.size()-1; i>=0; i--){
bw.write(lines.get(i));
bw.newLine();
}
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
You're going to want a list of lines, since you don't know the number of entries beforehand, so you want something that can grow with your code.
List<String> lines = new ArrayList<String>();
And add all your lines to it
while ((line = br.readLine()) != null) {
lines.add(line);
}
Then write them to your file in reverse order:
for(int i = lines.size() - 1; i >= 0; i--) {
bw.write(lines.get(i));
bw.newLine();
}
Your code is concatenating the string incorrectly. It needs to add the line text to the beginning of the string rather than at the end if you are trying to reverse the order.
txt = line + txt + "\n"; //original: txt += linia + "\n"
But it would be better to use a StringBuilder object to handle the concatenation for you. Something like...
StringBuilder txt = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
txt.insert(0, line + "\n");
}
System.out.println(txt.toString());
I do agree that the array approach in the other answers would also work and is probably a little easier to read and maintain. But the StringBuilder approach is closer to what you already have.
It should work:
package test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
/**
*
* #author
*/
public class Read {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader(
"D:/file.txt"));
String line, txt = "";
ArrayList<String> lines = new ArrayList<String>();
while ((line = br.readLine()) != null) {
lines.add(line);
}
System.out.println(txt);
br.close();
BufferedWriter bw = new BufferedWriter(new FileWriter("D:/file2.txt"));
for(int i = lines.size()-1; i>=0; i--){
bw.write(lines.get(i));
bw.newLine();
}
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

How to read BufferedReader faster

I want to optimize this code:
InputStream is = rp.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String text = "";
String aux = "";
while ((aux = reader.readLine()) != null) {
text += aux;
}
The thing is that i don't know how to read the content of the bufferedreader and copy it in a String faster than what I have above.
I need to spend as little time as possible.
Thank you
Using string concatenation in a loop is the classic performance killer (because Strings are immutable, the entire, increasingly large String is copied for each concatenation). Do this instead:
StringBuilder builder = new StringBuilder();
String aux = "";
while ((aux = reader.readLine()) != null) {
builder.append(aux);
}
String text = builder.toString();
You can try Apache IOUtils.toString. This is what they do:
StringWriter sw = new StringWriter();
char[] buffer = new char[1024 * 4];
int n = 0;
while (-1 != (n = input.read(buffer))) {
sw.write(buffer, 0, n);
}
String text = sw.toString();
When BufferedReader reads from Socket, it is necessary to add bufferedReader.ready():
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuilder sb= new StringBuilder();
String line = "";
while (br.ready() && (line = br.readLine()) != null) {
sb.append(line + "\r\n");
}
String result = sb.toString();
One line solution:
String result = reader.lines().collect(joining(lineSeparator()));
Imports:
import java.io.*;
import static java.lang.System.lineSeparator;
import static java.util.stream.Collectors.joining;
I wrote a simple function to do this using StringBuilder and While loop with catching IOException inside.
public String getString(BufferedReader bufferedReader) {
StringBuilder stringBuilder = new StringBuilder();
String line = null;
do {
try {
if ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append(System.lineSeparator());
}
} catch (IOException e) {
e.printStackTrace();
}
} while (line != null);
return stringBuilder.toString();
}
You can use StringBuffer
while ((aux = reader.readLine()) != null) {
stringBuffer.append(aux);
}

Categories

Resources