Merge pull request #9 from eugenp/master

fork update 13 nov 1
This commit is contained in:
AlNiyas 2019-11-13 22:28:28 +03:00 committed by GitHub
commit f49f76d3c2
95 changed files with 2004 additions and 233 deletions

View File

@ -0,0 +1,30 @@
package com.baeldung.algorithms.astar;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class Graph<T extends GraphNode> {
private final Set<T> nodes;
private final Map<String, Set<String>> connections;
public Graph(Set<T> nodes, Map<String, Set<String>> connections) {
this.nodes = nodes;
this.connections = connections;
}
public T getNode(String id) {
return nodes.stream()
.filter(node -> node.getId().equals(id))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No node found with ID"));
}
public Set<T> getConnections(T node) {
return connections.get(node.getId()).stream()
.map(this::getNode)
.collect(Collectors.toSet());
}
}

View File

@ -0,0 +1,5 @@
package com.baeldung.algorithms.astar;
public interface GraphNode {
String getId();
}

View File

@ -0,0 +1,66 @@
package com.baeldung.algorithms.astar;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.stream.Collectors;
public class RouteFinder<T extends GraphNode> {
private final Graph<T> graph;
private final Scorer<T> nextNodeScorer;
private final Scorer<T> targetScorer;
public RouteFinder(Graph<T> graph, Scorer<T> nextNodeScorer, Scorer<T> targetScorer) {
this.graph = graph;
this.nextNodeScorer = nextNodeScorer;
this.targetScorer = targetScorer;
}
public List<T> findRoute(T from, T to) {
Map<T, RouteNode<T>> allNodes = new HashMap<>();
Queue<RouteNode> openSet = new PriorityQueue<>();
RouteNode<T> start = new RouteNode<>(from, null, 0d, targetScorer.computeCost(from, to));
allNodes.put(from, start);
openSet.add(start);
while (!openSet.isEmpty()) {
System.out.println("Open Set contains: " + openSet.stream().map(RouteNode::getCurrent).collect(Collectors.toSet()));
RouteNode<T> next = openSet.poll();
System.out.println("Looking at node: " + next);
if (next.getCurrent().equals(to)) {
System.out.println("Found our destination!");
List<T> route = new ArrayList<>();
RouteNode<T> current = next;
do {
route.add(0, current.getCurrent());
current = allNodes.get(current.getPrevious());
} while (current != null);
System.out.println("Route: " + route);
return route;
}
graph.getConnections(next.getCurrent()).forEach(connection -> {
double newScore = next.getRouteScore() + nextNodeScorer.computeCost(next.getCurrent(), connection);
RouteNode<T> nextNode = allNodes.getOrDefault(connection, new RouteNode<>(connection));
allNodes.put(connection, nextNode);
if (nextNode.getRouteScore() > newScore) {
nextNode.setPrevious(next.getCurrent());
nextNode.setRouteScore(newScore);
nextNode.setEstimatedScore(newScore + targetScorer.computeCost(connection, to));
openSet.add(nextNode);
System.out.println("Found a better route to node: " + nextNode);
}
});
}
throw new IllegalStateException("No route found");
}
}

View File

@ -0,0 +1,67 @@
package com.baeldung.algorithms.astar;
import java.util.StringJoiner;
class RouteNode<T extends GraphNode> implements Comparable<RouteNode> {
private final T current;
private T previous;
private double routeScore;
private double estimatedScore;
RouteNode(T current) {
this(current, null, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
}
RouteNode(T current, T previous, double routeScore, double estimatedScore) {
this.current = current;
this.previous = previous;
this.routeScore = routeScore;
this.estimatedScore = estimatedScore;
}
T getCurrent() {
return current;
}
T getPrevious() {
return previous;
}
double getRouteScore() {
return routeScore;
}
double getEstimatedScore() {
return estimatedScore;
}
void setPrevious(T previous) {
this.previous = previous;
}
void setRouteScore(double routeScore) {
this.routeScore = routeScore;
}
void setEstimatedScore(double estimatedScore) {
this.estimatedScore = estimatedScore;
}
@Override
public int compareTo(RouteNode other) {
if (this.estimatedScore > other.estimatedScore) {
return 1;
} else if (this.estimatedScore < other.estimatedScore) {
return -1;
} else {
return 0;
}
}
@Override
public String toString() {
return new StringJoiner(", ", RouteNode.class.getSimpleName() + "[", "]").add("current=" + current)
.add("previous=" + previous).add("routeScore=" + routeScore).add("estimatedScore=" + estimatedScore)
.toString();
}
}

View File

@ -0,0 +1,5 @@
package com.baeldung.algorithms.astar;
public interface Scorer<T extends GraphNode> {
double computeCost(T from, T to);
}

View File

@ -0,0 +1,19 @@
package com.baeldung.algorithms.astar.underground;
import com.baeldung.algorithms.astar.Scorer;
public class HaversineScorer implements Scorer<Station> {
@Override
public double computeCost(Station from, Station to) {
double R = 6372.8; // In kilometers
double dLat = Math.toRadians(to.getLatitude() - from.getLatitude());
double dLon = Math.toRadians(to.getLongitude() - from.getLongitude());
double lat1 = Math.toRadians(from.getLatitude());
double lat2 = Math.toRadians(to.getLatitude());
double a = Math.pow(Math.sin(dLat / 2),2) + Math.pow(Math.sin(dLon / 2),2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return R * c;
}
}

View File

@ -0,0 +1,643 @@
package com.baeldung.algorithms.astar.underground;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.baeldung.algorithms.astar.Graph;
import com.baeldung.algorithms.astar.RouteFinder;
import org.junit.Before;
import org.junit.Test;
public class RouteFinderIntegrationTest {
private Graph<Station> underground;
private RouteFinder<Station> routeFinder;
@Before
public void setUp() throws Exception {
Set<Station> stations = new HashSet<>();
Map<String, Set<String>> connections = new HashMap<>();
stations.add(new Station("1", "Acton Town", 51.5028, -0.2801));
stations.add(new Station("2", "Aldgate", 51.5143, -0.0755));
stations.add(new Station("3", "Aldgate East", 51.5154, -0.0726));
stations.add(new Station("4", "All Saints", 51.5107, -0.013));
stations.add(new Station("5", "Alperton", 51.5407, -0.2997));
stations.add(new Station("6", "Amersham", 51.6736, -0.607));
stations.add(new Station("7", "Angel", 51.5322, -0.1058));
stations.add(new Station("8", "Archway", 51.5653, -0.1353));
stations.add(new Station("9", "Arnos Grove", 51.6164, -0.1331));
stations.add(new Station("10", "Arsenal", 51.5586, -0.1059));
stations.add(new Station("11", "Baker Street", 51.5226, -0.1571));
stations.add(new Station("12", "Balham", 51.4431, -0.1525));
stations.add(new Station("13", "Bank", 51.5133, -0.0886));
stations.add(new Station("14", "Barbican", 51.5204, -0.0979));
stations.add(new Station("15", "Barking", 51.5396, 0.081));
stations.add(new Station("16", "Barkingside", 51.5856, 0.0887));
stations.add(new Station("17", "Barons Court", 51.4905, -0.2139));
stations.add(new Station("18", "Bayswater", 51.5121, -0.1879));
stations.add(new Station("19", "Beckton", 51.5148, 0.0613));
stations.add(new Station("20", "Beckton Park", 51.5087, 0.055));
stations.add(new Station("21", "Becontree", 51.5403, 0.127));
stations.add(new Station("22", "Belsize Park", 51.5504, -0.1642));
stations.add(new Station("23", "Bermondsey", 51.4979, -0.0637));
stations.add(new Station("24", "Bethnal Green", 51.527, -0.0549));
stations.add(new Station("25", "Blackfriars", 51.512, -0.1031));
stations.add(new Station("26", "Blackhorse Road", 51.5867, -0.0417));
stations.add(new Station("27", "Blackwall", 51.5079, -0.0066));
stations.add(new Station("28", "Bond Street", 51.5142, -0.1494));
stations.add(new Station("29", "Borough", 51.5011, -0.0943));
stations.add(new Station("30", "Boston Manor", 51.4956, -0.325));
stations.add(new Station("31", "Bounds Green", 51.6071, -0.1243));
stations.add(new Station("32", "Bow Church", 51.5273, -0.0208));
stations.add(new Station("33", "Bow Road", 51.5269, -0.0247));
stations.add(new Station("34", "Brent Cross", 51.5766, -0.2136));
stations.add(new Station("35", "Brixton", 51.4627, -0.1145));
stations.add(new Station("36", "Bromley-By-Bow", 51.5248, -0.0119));
stations.add(new Station("37", "Buckhurst Hill", 51.6266, 0.0471));
stations.add(new Station("38", "Burnt Oak", 51.6028, -0.2641));
stations.add(new Station("39", "Caledonian Road", 51.5481, -0.1188));
stations.add(new Station("40", "Camden Town", 51.5392, -0.1426));
stations.add(new Station("41", "Canada Water", 51.4982, -0.0502));
stations.add(new Station("42", "Canary Wharf", 51.5051, -0.0209));
stations.add(new Station("43", "Canning Town", 51.5147, 0.0082));
stations.add(new Station("44", "Cannon Street", 51.5113, -0.0904));
stations.add(new Station("45", "Canons Park", 51.6078, -0.2947));
stations.add(new Station("46", "Chalfont & Latimer", 51.6679, -0.561));
stations.add(new Station("47", "Chalk Farm", 51.5441, -0.1538));
stations.add(new Station("48", "Chancery Lane", 51.5185, -0.1111));
stations.add(new Station("49", "Charing Cross", 51.508, -0.1247));
stations.add(new Station("50", "Chesham", 51.7052, -0.611));
stations.add(new Station("51", "Chigwell", 51.6177, 0.0755));
stations.add(new Station("52", "Chiswick Park", 51.4946, -0.2678));
stations.add(new Station("53", "Chorleywood", 51.6543, -0.5183));
stations.add(new Station("54", "Clapham Common", 51.4618, -0.1384));
stations.add(new Station("55", "Clapham North", 51.4649, -0.1299));
stations.add(new Station("56", "Clapham South", 51.4527, -0.148));
stations.add(new Station("57", "Cockfosters", 51.6517, -0.1496));
stations.add(new Station("58", "Colindale", 51.5955, -0.2502));
stations.add(new Station("59", "Colliers Wood", 51.418, -0.1778));
stations.add(new Station("60", "Covent Garden", 51.5129, -0.1243));
stations.add(new Station("61", "Crossharbour & London Arena", 51.4957, -0.0144));
stations.add(new Station("62", "Croxley", 51.647, -0.4412));
stations.add(new Station("63", "Custom House", 51.5095, 0.0276));
stations.add(new Station("64", "Cutty Sark", 51.4827, -0.0096));
stations.add(new Station("65", "Cyprus", 51.5085, 0.064));
stations.add(new Station("66", "Dagenham East", 51.5443, 0.1655));
stations.add(new Station("67", "Dagenham Heathway", 51.5417, 0.1469));
stations.add(new Station("68", "Debden", 51.6455, 0.0838));
stations.add(new Station("69", "Deptford Bridge", 51.474, -0.0216));
stations.add(new Station("70", "Devons Road", 51.5223, -0.0173));
stations.add(new Station("71", "Dollis Hill", 51.552, -0.2387));
stations.add(new Station("72", "Ealing Broadway", 51.5152, -0.3017));
stations.add(new Station("73", "Ealing Common", 51.5101, -0.2882));
stations.add(new Station("74", "Earl's Court", 51.492, -0.1973));
stations.add(new Station("75", "Eastcote", 51.5765, -0.397));
stations.add(new Station("76", "East Acton", 51.5168, -0.2474));
stations.add(new Station("77", "East Finchley", 51.5874, -0.165));
stations.add(new Station("78", "East Ham", 51.5394, 0.0518));
stations.add(new Station("79", "East India", 51.5093, -0.0021));
stations.add(new Station("80", "East Putney", 51.4586, -0.2112));
stations.add(new Station("81", "Edgware", 51.6137, -0.275));
stations.add(new Station("82", "Edgware Road (B)", 51.5199, -0.1679));
stations.add(new Station("83", "Edgware Road (C)", 51.5203, -0.17));
stations.add(new Station("84", "Elephant & Castle", 51.4943, -0.1001));
stations.add(new Station("85", "Elm Park", 51.5496, 0.1977));
stations.add(new Station("86", "Elverson Road", 51.4693, -0.0174));
stations.add(new Station("87", "Embankment", 51.5074, -0.1223));
stations.add(new Station("88", "Epping", 51.6937, 0.1139));
stations.add(new Station("89", "Euston", 51.5282, -0.1337));
stations.add(new Station("90", "Euston Square", 51.526, -0.1359));
stations.add(new Station("91", "Fairlop", 51.596, 0.0912));
stations.add(new Station("92", "Farringdon", 51.5203, -0.1053));
stations.add(new Station("93", "Finchley Central", 51.6012, -0.1932));
stations.add(new Station("94", "Finchley Road", 51.5472, -0.1803));
stations.add(new Station("95", "Finsbury Park", 51.5642, -0.1065));
stations.add(new Station("96", "Fulham Broadway", 51.4804, -0.195));
stations.add(new Station("97", "Gallions Reach", 51.5096, 0.0716));
stations.add(new Station("98", "Gants Hill", 51.5765, 0.0663));
stations.add(new Station("99", "Gloucester Road", 51.4945, -0.1829));
stations.add(new Station("100", "Golders Green", 51.5724, -0.1941));
stations.add(new Station("101", "Goldhawk Road", 51.5018, -0.2267));
stations.add(new Station("102", "Goodge Street", 51.5205, -0.1347));
stations.add(new Station("103", "Grange Hill", 51.6132, 0.0923));
stations.add(new Station("104", "Great Portland Street", 51.5238, -0.1439));
stations.add(new Station("105", "Greenford", 51.5423, -0.3456));
stations.add(new Station("106", "Greenwich", 51.4781, -0.0149));
stations.add(new Station("107", "Green Park", 51.5067, -0.1428));
stations.add(new Station("108", "Gunnersbury", 51.4915, -0.2754));
stations.add(new Station("109", "Hainault", 51.603, 0.0933));
stations.add(new Station("110", "Hammersmith", 51.4936, -0.2251));
stations.add(new Station("111", "Hampstead", 51.5568, -0.178));
stations.add(new Station("112", "Hanger Lane", 51.5302, -0.2933));
stations.add(new Station("113", "Harlesden", 51.5362, -0.2575));
stations.add(new Station("114", "Harrow & Wealdston", 51.5925, -0.3351));
stations.add(new Station("115", "Harrow-on-the-Hill", 51.5793, -0.3366));
stations.add(new Station("116", "Hatton Cross", 51.4669, -0.4227));
stations.add(new Station("117", "Heathrow Terminals 1, 2 & 3", 51.4713, -0.4524));
stations.add(new Station("118", "Heathrow Terminal 4", 51.4598, -0.4476));
stations.add(new Station("119", "Hendon Central", 51.5829, -0.2259));
stations.add(new Station("120", "Heron Quays", 51.5033, -0.0215));
stations.add(new Station("121", "High Barnet", 51.6503, -0.1943));
stations.add(new Station("122", "High Street Kensington", 51.5009, -0.1925));
stations.add(new Station("123", "Highbury & Islington", 51.546, -0.104));
stations.add(new Station("124", "Highgate", 51.5777, -0.1458));
stations.add(new Station("125", "Hillingdon", 51.5538, -0.4499));
stations.add(new Station("126", "Holborn", 51.5174, -0.12));
stations.add(new Station("127", "Holland Park", 51.5075, -0.206));
stations.add(new Station("128", "Holloway Road", 51.5526, -0.1132));
stations.add(new Station("129", "Hornchurch", 51.5539, 0.2184));
stations.add(new Station("130", "Hounslow Central", 51.4713, -0.3665));
stations.add(new Station("131", "Hounslow East", 51.4733, -0.3564));
stations.add(new Station("132", "Hounslow West", 51.4734, -0.3855));
stations.add(new Station("133", "Hyde Park Corner", 51.5027, -0.1527));
stations.add(new Station("134", "Ickenham", 51.5619, -0.4421));
stations.add(new Station("135", "Island Gardens", 51.4871, -0.0101));
stations.add(new Station("136", "Kennington", 51.4884, -0.1053));
stations.add(new Station("137", "Kensal Green", 51.5304, -0.225));
stations.add(new Station("138", "Kensington (Olympia)", 51.4983, -0.2106));
stations.add(new Station("139", "Kentish Town", 51.5507, -0.1402));
stations.add(new Station("140", "Kenton", 51.5816, -0.3162));
stations.add(new Station("141", "Kew Gardens", 51.477, -0.285));
stations.add(new Station("142", "Kilburn", 51.5471, -0.2047));
stations.add(new Station("143", "Kilburn Park", 51.5351, -0.1939));
stations.add(new Station("144", "Kingsbury", 51.5846, -0.2786));
stations.add(new Station("145", "King's Cross St. Pancras", 51.5308, -0.1238));
stations.add(new Station("146", "Knightsbridge", 51.5015, -0.1607));
stations.add(new Station("147", "Ladbroke Grove", 51.5172, -0.2107));
stations.add(new Station("148", "Lambeth North", 51.4991, -0.1115));
stations.add(new Station("149", "Lancaster Gate", 51.5119, -0.1756));
stations.add(new Station("150", "Latimer Road", 51.5139, -0.2172));
stations.add(new Station("151", "Leicester Square", 51.5113, -0.1281));
stations.add(new Station("152", "Lewisham", 51.4657, -0.0142));
stations.add(new Station("153", "Leyton", 51.5566, -0.0053));
stations.add(new Station("154", "Leytonstone", 51.5683, 0.0083));
stations.add(new Station("155", "Limehouse", 51.5123, -0.0396));
stations.add(new Station("156", "Liverpool Street", 51.5178, -0.0823));
stations.add(new Station("157", "London Bridge", 51.5052, -0.0864));
stations.add(new Station("158", "Loughton", 51.6412, 0.0558));
stations.add(new Station("159", "Maida Vale", 51.53, -0.1854));
stations.add(new Station("160", "Manor House", 51.5712, -0.0958));
stations.add(new Station("161", "Mansion House", 51.5122, -0.094));
stations.add(new Station("162", "Marble Arch", 51.5136, -0.1586));
stations.add(new Station("163", "Marylebone", 51.5225, -0.1631));
stations.add(new Station("164", "Mile End", 51.5249, -0.0332));
stations.add(new Station("165", "Mill Hill East", 51.6082, -0.2103));
stations.add(new Station("166", "Monument", 51.5108, -0.0863));
stations.add(new Station("167", "Moorgate", 51.5186, -0.0886));
stations.add(new Station("168", "Moor Park", 51.6294, -0.432));
stations.add(new Station("169", "Morden", 51.4022, -0.1948));
stations.add(new Station("170", "Mornington Crescent", 51.5342, -0.1387));
stations.add(new Station("171", "Mudchute", 51.4902, -0.0145));
stations.add(new Station("172", "Neasden", 51.5542, -0.2503));
stations.add(new Station("173", "Newbury Park", 51.5756, 0.0899));
stations.add(new Station("174", "New Cross", 51.4767, -0.0327));
stations.add(new Station("175", "New Cross Gate", 51.4757, -0.0402));
stations.add(new Station("176", "Northfields", 51.4995, -0.3142));
stations.add(new Station("177", "Northolt", 51.5483, -0.3687));
stations.add(new Station("178", "Northwick Park", 51.5784, -0.3184));
stations.add(new Station("179", "Northwood", 51.6111, -0.424));
stations.add(new Station("180", "Northwood Hills", 51.6004, -0.4092));
stations.add(new Station("181", "North Acton", 51.5237, -0.2597));
stations.add(new Station("182", "North Ealing", 51.5175, -0.2887));
stations.add(new Station("183", "North Greenwich", 51.5005, 0.0039));
stations.add(new Station("184", "North Harrow", 51.5846, -0.3626));
stations.add(new Station("185", "North Wembley", 51.5621, -0.3034));
stations.add(new Station("186", "Notting Hill Gate", 51.5094, -0.1967));
stations.add(new Station("187", "Oakwood", 51.6476, -0.1318));
stations.add(new Station("188", "Old Street", 51.5263, -0.0873));
stations.add(new Station("189", "Osterley", 51.4813, -0.3522));
stations.add(new Station("190", "Oval", 51.4819, -0.113));
stations.add(new Station("191", "Oxford Circus", 51.515, -0.1415));
stations.add(new Station("192", "Paddington", 51.5154, -0.1755));
stations.add(new Station("193", "Park Royal", 51.527, -0.2841));
stations.add(new Station("194", "Parsons Green", 51.4753, -0.2011));
stations.add(new Station("195", "Perivale", 51.5366, -0.3232));
stations.add(new Station("196", "Picadilly Circus", 51.5098, -0.1342));
stations.add(new Station("197", "Pimlico", 51.4893, -0.1334));
stations.add(new Station("198", "Pinner", 51.5926, -0.3805));
stations.add(new Station("199", "Plaistow", 51.5313, 0.0172));
stations.add(new Station("200", "Poplar", 51.5077, -0.0173));
stations.add(new Station("201", "Preston Road", 51.572, -0.2954));
stations.add(new Station("202", "Prince Regent", 51.5093, 0.0336));
stations.add(new Station("203", "Pudding Mill Lane", 51.5343, -0.0139));
stations.add(new Station("204", "Putney Bridge", 51.4682, -0.2089));
stations.add(new Station("205", "Queen's Park", 51.5341, -0.2047));
stations.add(new Station("206", "Queensbury", 51.5942, -0.2861));
stations.add(new Station("207", "Queensway", 51.5107, -0.1877));
stations.add(new Station("208", "Ravenscourt Park", 51.4942, -0.2359));
stations.add(new Station("209", "Rayners Lane", 51.5753, -0.3714));
stations.add(new Station("210", "Redbridge", 51.5763, 0.0454));
stations.add(new Station("211", "Regent's Park", 51.5234, -0.1466));
stations.add(new Station("212", "Richmond", 51.4633, -0.3013));
stations.add(new Station("213", "Rickmansworth", 51.6404, -0.4733));
stations.add(new Station("214", "Roding Valley", 51.6171, 0.0439));
stations.add(new Station("215", "Rotherhithe", 51.501, -0.0525));
stations.add(new Station("216", "Royal Albert", 51.5084, 0.0465));
stations.add(new Station("217", "Royal Oak", 51.519, -0.188));
stations.add(new Station("218", "Royal Victoria", 51.5091, 0.0181));
stations.add(new Station("219", "Ruislip", 51.5715, -0.4213));
stations.add(new Station("220", "Ruislip Gardens", 51.5606, -0.4103));
stations.add(new Station("221", "Ruislip Manor", 51.5732, -0.4125));
stations.add(new Station("222", "Russell Square", 51.523, -0.1244));
stations.add(new Station("223", "Seven Sisters", 51.5822, -0.0749));
stations.add(new Station("224", "Shadwell", 51.5117, -0.056));
stations.add(new Station("225", "Shepherd's Bush (C)", 51.5046, -0.2187));
stations.add(new Station("226", "Shepherd's Bush (H)", 51.5058, -0.2265));
stations.add(new Station("227", "Shoreditch", 51.5227, -0.0708));
stations.add(new Station("228", "Sloane Square", 51.4924, -0.1565));
stations.add(new Station("229", "Snaresbrook", 51.5808, 0.0216));
stations.add(new Station("230", "Southfields", 51.4454, -0.2066));
stations.add(new Station("231", "Southgate", 51.6322, -0.128));
stations.add(new Station("232", "Southwark", 51.501, -0.1052));
stations.add(new Station("233", "South Ealing", 51.5011, -0.3072));
stations.add(new Station("234", "South Harrow", 51.5646, -0.3521));
stations.add(new Station("235", "South Kensington", 51.4941, -0.1738));
stations.add(new Station("236", "South Kenton", 51.5701, -0.3081));
stations.add(new Station("237", "South Quay", 51.5007, -0.0191));
stations.add(new Station("238", "South Ruislip", 51.5569, -0.3988));
stations.add(new Station("239", "South Wimbledon", 51.4154, -0.1919));
stations.add(new Station("240", "South Woodford", 51.5917, 0.0275));
stations.add(new Station("241", "Stamford Brook", 51.495, -0.2459));
stations.add(new Station("242", "Stanmore", 51.6194, -0.3028));
stations.add(new Station("243", "Stepney Green", 51.5221, -0.047));
stations.add(new Station("244", "Stockwell", 51.4723, -0.123));
stations.add(new Station("245", "Stonebridge Park", 51.5439, -0.2759));
stations.add(new Station("246", "Stratford", 51.5416, -0.0042));
stations.add(new Station("247", "St. James's Park", 51.4994, -0.1335));
stations.add(new Station("248", "St. John's Wood", 51.5347, -0.174));
stations.add(new Station("249", "St. Paul's", 51.5146, -0.0973));
stations.add(new Station("250", "Sudbury Hill", 51.5569, -0.3366));
stations.add(new Station("251", "Sudbury Town", 51.5507, -0.3156));
stations.add(new Station("252", "Surrey Quays", 51.4933, -0.0478));
stations.add(new Station("253", "Swiss Cottage", 51.5432, -0.1738));
stations.add(new Station("254", "Temple", 51.5111, -0.1141));
stations.add(new Station("255", "Theydon Bois", 51.6717, 0.1033));
stations.add(new Station("256", "Tooting Bec", 51.4361, -0.1598));
stations.add(new Station("257", "Tooting Broadway", 51.4275, -0.168));
stations.add(new Station("258", "Tottenham Court Road", 51.5165, -0.131));
stations.add(new Station("259", "Tottenham Hale", 51.5882, -0.0594));
stations.add(new Station("260", "Totteridge & Whetstone", 51.6302, -0.1791));
stations.add(new Station("261", "Tower Gateway", 51.5106, -0.0743));
stations.add(new Station("262", "Tower Hill", 51.5098, -0.0766));
stations.add(new Station("263", "Tufnell Park", 51.5567, -0.1374));
stations.add(new Station("264", "Turnham Green", 51.4951, -0.2547));
stations.add(new Station("265", "Turnpike Lane", 51.5904, -0.1028));
stations.add(new Station("266", "Upminster", 51.559, 0.251));
stations.add(new Station("267", "Upminster Bridge", 51.5582, 0.2343));
stations.add(new Station("268", "Upney", 51.5385, 0.1014));
stations.add(new Station("269", "Upton Park", 51.5352, 0.0343));
stations.add(new Station("270", "Uxbridge", 51.5463, -0.4786));
stations.add(new Station("271", "Vauxhall", 51.4861, -0.1253));
stations.add(new Station("272", "Victoria", 51.4965, -0.1447));
stations.add(new Station("273", "Walthamstow Central", 51.583, -0.0195));
stations.add(new Station("274", "Wanstead", 51.5775, 0.0288));
stations.add(new Station("275", "Wapping", 51.5043, -0.0558));
stations.add(new Station("276", "Warren Street", 51.5247, -0.1384));
stations.add(new Station("277", "Warwick Avenue", 51.5235, -0.1835));
stations.add(new Station("278", "Waterloo", 51.5036, -0.1143));
stations.add(new Station("279", "Watford", 51.6573, -0.4177));
stations.add(new Station("280", "Wembley Central", 51.5519, -0.2963));
stations.add(new Station("281", "Wembley Park", 51.5635, -0.2795));
stations.add(new Station("282", "Westbourne Park", 51.521, -0.2011));
stations.add(new Station("283", "Westferry", 51.5097, -0.0265));
stations.add(new Station("284", "Westminster", 51.501, -0.1254));
stations.add(new Station("285", "West Acton", 51.518, -0.2809));
stations.add(new Station("286", "West Brompton", 51.4872, -0.1953));
stations.add(new Station("287", "West Finchley", 51.6095, -0.1883));
stations.add(new Station("288", "West Ham", 51.5287, 0.0056));
stations.add(new Station("289", "West Hampstead", 51.5469, -0.1906));
stations.add(new Station("290", "West Harrow", 51.5795, -0.3533));
stations.add(new Station("291", "West India Quay", 51.507, -0.0203));
stations.add(new Station("292", "West Kensington", 51.4907, -0.2065));
stations.add(new Station("293", "West Ruislip", 51.5696, -0.4376));
stations.add(new Station("294", "Whitechapel", 51.5194, -0.0612));
stations.add(new Station("295", "White City", 51.512, -0.2239));
stations.add(new Station("296", "Willesden Green", 51.5492, -0.2215));
stations.add(new Station("297", "Willesden Junction", 51.5326, -0.2478));
stations.add(new Station("298", "Wimbledon", 51.4214, -0.2064));
stations.add(new Station("299", "Wimbledon Park", 51.4343, -0.1992));
stations.add(new Station("300", "Woodford", 51.607, 0.0341));
stations.add(new Station("301", "Woodside Park", 51.6179, -0.1856));
stations.add(new Station("302", "Wood Green", 51.5975, -0.1097));
connections.put("1", Stream.of("52","73","73","233","264").collect(Collectors.toSet()));
connections.put("2", Stream.of("156","262","156").collect(Collectors.toSet()));
connections.put("3", Stream.of("262","294","156","294").collect(Collectors.toSet()));
connections.put("4", Stream.of("70","200").collect(Collectors.toSet()));
connections.put("5", Stream.of("193","251").collect(Collectors.toSet()));
connections.put("6", Stream.of("46").collect(Collectors.toSet()));
connections.put("7", Stream.of("145","188").collect(Collectors.toSet()));
connections.put("8", Stream.of("124","263").collect(Collectors.toSet()));
connections.put("9", Stream.of("31","231").collect(Collectors.toSet()));
connections.put("10", Stream.of("95","128").collect(Collectors.toSet()));
connections.put("11", Stream.of("163","211","83","104","83","104","28","248","94","104").collect(Collectors.toSet()));
connections.put("12", Stream.of("56","256").collect(Collectors.toSet()));
connections.put("13", Stream.of("156","249","224","157","167","278").collect(Collectors.toSet()));
connections.put("14", Stream.of("92","167","92","167","92","167").collect(Collectors.toSet()));
connections.put("15", Stream.of("78","268","78").collect(Collectors.toSet()));
connections.put("16", Stream.of("91","173").collect(Collectors.toSet()));
connections.put("17", Stream.of("110","292","74","110").collect(Collectors.toSet()));
connections.put("18", Stream.of("186","192","186","192").collect(Collectors.toSet()));
connections.put("19", Stream.of("97").collect(Collectors.toSet()));
connections.put("20", Stream.of("65","216").collect(Collectors.toSet()));
connections.put("21", Stream.of("67","268").collect(Collectors.toSet()));
connections.put("22", Stream.of("47","111").collect(Collectors.toSet()));
connections.put("23", Stream.of("41","157").collect(Collectors.toSet()));
connections.put("24", Stream.of("156","164").collect(Collectors.toSet()));
connections.put("25", Stream.of("161","254","161","254").collect(Collectors.toSet()));
connections.put("26", Stream.of("259","273").collect(Collectors.toSet()));
connections.put("27", Stream.of("79","200").collect(Collectors.toSet()));
connections.put("28", Stream.of("162","191","11","107").collect(Collectors.toSet()));
connections.put("29", Stream.of("84","157").collect(Collectors.toSet()));
connections.put("30", Stream.of("176","189").collect(Collectors.toSet()));
connections.put("31", Stream.of("9","302").collect(Collectors.toSet()));
connections.put("32", Stream.of("70","203").collect(Collectors.toSet()));
connections.put("33", Stream.of("36","164","36","164").collect(Collectors.toSet()));
connections.put("34", Stream.of("100","119").collect(Collectors.toSet()));
connections.put("35", Stream.of("244").collect(Collectors.toSet()));
connections.put("36", Stream.of("33","288","33","288").collect(Collectors.toSet()));
connections.put("37", Stream.of("158","300").collect(Collectors.toSet()));
connections.put("38", Stream.of("58","81").collect(Collectors.toSet()));
connections.put("39", Stream.of("128","145").collect(Collectors.toSet()));
connections.put("40", Stream.of("47","89","139","170").collect(Collectors.toSet()));
connections.put("41", Stream.of("215","252","23","42").collect(Collectors.toSet()));
connections.put("42", Stream.of("120","291","41","183").collect(Collectors.toSet()));
connections.put("43", Stream.of("79","218","183","288").collect(Collectors.toSet()));
connections.put("44", Stream.of("161","166","161","166").collect(Collectors.toSet()));
connections.put("45", Stream.of("206","242").collect(Collectors.toSet()));
connections.put("46", Stream.of("6","50","53").collect(Collectors.toSet()));
connections.put("47", Stream.of("22","40").collect(Collectors.toSet()));
connections.put("48", Stream.of("126","249").collect(Collectors.toSet()));
connections.put("49", Stream.of("87","196","87","151").collect(Collectors.toSet()));
connections.put("50", Stream.of("46").collect(Collectors.toSet()));
connections.put("51", Stream.of("103","214").collect(Collectors.toSet()));
connections.put("52", Stream.of("1","264").collect(Collectors.toSet()));
connections.put("53", Stream.of("46","213").collect(Collectors.toSet()));
connections.put("54", Stream.of("55","56").collect(Collectors.toSet()));
connections.put("55", Stream.of("54","244").collect(Collectors.toSet()));
connections.put("56", Stream.of("12","54").collect(Collectors.toSet()));
connections.put("57", Stream.of("187").collect(Collectors.toSet()));
connections.put("58", Stream.of("38","119").collect(Collectors.toSet()));
connections.put("59", Stream.of("239","257").collect(Collectors.toSet()));
connections.put("60", Stream.of("126","151").collect(Collectors.toSet()));
connections.put("61", Stream.of("171","237").collect(Collectors.toSet()));
connections.put("62", Stream.of("168","279").collect(Collectors.toSet()));
connections.put("63", Stream.of("202","218").collect(Collectors.toSet()));
connections.put("64", Stream.of("106","135").collect(Collectors.toSet()));
connections.put("65", Stream.of("20","97").collect(Collectors.toSet()));
connections.put("66", Stream.of("67","85").collect(Collectors.toSet()));
connections.put("67", Stream.of("21","66").collect(Collectors.toSet()));
connections.put("68", Stream.of("158","255").collect(Collectors.toSet()));
connections.put("69", Stream.of("86","106").collect(Collectors.toSet()));
connections.put("70", Stream.of("4","32").collect(Collectors.toSet()));
connections.put("71", Stream.of("172","296").collect(Collectors.toSet()));
connections.put("72", Stream.of("285","73").collect(Collectors.toSet()));
connections.put("73", Stream.of("72","1","1","182").collect(Collectors.toSet()));
connections.put("74", Stream.of("99","122","138","286","292","17","99").collect(Collectors.toSet()));
connections.put("75", Stream.of("209","221","209","221").collect(Collectors.toSet()));
connections.put("76", Stream.of("181","295").collect(Collectors.toSet()));
connections.put("77", Stream.of("93","124").collect(Collectors.toSet()));
connections.put("78", Stream.of("15","269","15","269").collect(Collectors.toSet()));
connections.put("79", Stream.of("27","43").collect(Collectors.toSet()));
connections.put("80", Stream.of("204","230").collect(Collectors.toSet()));
connections.put("81", Stream.of("38").collect(Collectors.toSet()));
connections.put("82", Stream.of("163","192").collect(Collectors.toSet()));
connections.put("83", Stream.of("11","192","192","11","192").collect(Collectors.toSet()));
connections.put("84", Stream.of("148","29","136").collect(Collectors.toSet()));
connections.put("85", Stream.of("66","129").collect(Collectors.toSet()));
connections.put("86", Stream.of("69","152").collect(Collectors.toSet()));
connections.put("87", Stream.of("49","278","254","284","254","284","49","278").collect(Collectors.toSet()));
connections.put("88", Stream.of("255").collect(Collectors.toSet()));
connections.put("89", Stream.of("40","145","170","276","145","276").collect(Collectors.toSet()));
connections.put("90", Stream.of("104","145","104","145","104","145").collect(Collectors.toSet()));
connections.put("91", Stream.of("16","109").collect(Collectors.toSet()));
connections.put("92", Stream.of("14","145","14","145","14","145").collect(Collectors.toSet()));
connections.put("93", Stream.of("77","165","287").collect(Collectors.toSet()));
connections.put("94", Stream.of("253","289","11","281").collect(Collectors.toSet()));
connections.put("95", Stream.of("10","160","123","223").collect(Collectors.toSet()));
connections.put("96", Stream.of("194","286").collect(Collectors.toSet()));
connections.put("97", Stream.of("19","65").collect(Collectors.toSet()));
connections.put("98", Stream.of("173","210").collect(Collectors.toSet()));
connections.put("99", Stream.of("122","235","74","235","74","235").collect(Collectors.toSet()));
connections.put("100", Stream.of("34","111").collect(Collectors.toSet()));
connections.put("101", Stream.of("110","226").collect(Collectors.toSet()));
connections.put("102", Stream.of("258","276").collect(Collectors.toSet()));
connections.put("103", Stream.of("51","109").collect(Collectors.toSet()));
connections.put("104", Stream.of("11","90","11","90","11","90").collect(Collectors.toSet()));
connections.put("105", Stream.of("177","195").collect(Collectors.toSet()));
connections.put("106", Stream.of("64","69").collect(Collectors.toSet()));
connections.put("107", Stream.of("28","284","133","196","191","272").collect(Collectors.toSet()));
connections.put("108", Stream.of("141","264").collect(Collectors.toSet()));
connections.put("109", Stream.of("91","103").collect(Collectors.toSet()));
connections.put("110", Stream.of("17","208","101","17","264").collect(Collectors.toSet()));
connections.put("111", Stream.of("22","100").collect(Collectors.toSet()));
connections.put("112", Stream.of("181","195").collect(Collectors.toSet()));
connections.put("113", Stream.of("245","297").collect(Collectors.toSet()));
connections.put("114", Stream.of("140").collect(Collectors.toSet()));
connections.put("115", Stream.of("178","184","290").collect(Collectors.toSet()));
connections.put("116", Stream.of("117","118","132").collect(Collectors.toSet()));
connections.put("117", Stream.of("116","118").collect(Collectors.toSet()));
connections.put("118", Stream.of("116","117").collect(Collectors.toSet()));
connections.put("119", Stream.of("34","58").collect(Collectors.toSet()));
connections.put("120", Stream.of("42","237").collect(Collectors.toSet()));
connections.put("121", Stream.of("260").collect(Collectors.toSet()));
connections.put("122", Stream.of("99","186","74","186").collect(Collectors.toSet()));
connections.put("123", Stream.of("95","145").collect(Collectors.toSet()));
connections.put("124", Stream.of("8","77").collect(Collectors.toSet()));
connections.put("125", Stream.of("134","270","134","270").collect(Collectors.toSet()));
connections.put("126", Stream.of("48","258","60","222").collect(Collectors.toSet()));
connections.put("127", Stream.of("186","225").collect(Collectors.toSet()));
connections.put("128", Stream.of("10","39").collect(Collectors.toSet()));
connections.put("129", Stream.of("85","267").collect(Collectors.toSet()));
connections.put("130", Stream.of("131","132").collect(Collectors.toSet()));
connections.put("131", Stream.of("130","189").collect(Collectors.toSet()));
connections.put("132", Stream.of("116","130").collect(Collectors.toSet()));
connections.put("133", Stream.of("107","146").collect(Collectors.toSet()));
connections.put("134", Stream.of("125","219","125","219").collect(Collectors.toSet()));
connections.put("135", Stream.of("64","171").collect(Collectors.toSet()));
connections.put("136", Stream.of("84","190","278").collect(Collectors.toSet()));
connections.put("137", Stream.of("205","297").collect(Collectors.toSet()));
connections.put("138", Stream.of("74").collect(Collectors.toSet()));
connections.put("139", Stream.of("40","263").collect(Collectors.toSet()));
connections.put("140", Stream.of("114","236").collect(Collectors.toSet()));
connections.put("141", Stream.of("108","212").collect(Collectors.toSet()));
connections.put("142", Stream.of("289","296").collect(Collectors.toSet()));
connections.put("143", Stream.of("159","205").collect(Collectors.toSet()));
connections.put("144", Stream.of("206","281").collect(Collectors.toSet()));
connections.put("145", Stream.of("90","92","90","92","90","92","7","89","39","222","89","123").collect(Collectors.toSet()));
connections.put("146", Stream.of("133","235").collect(Collectors.toSet()));
connections.put("147", Stream.of("150","282").collect(Collectors.toSet()));
connections.put("148", Stream.of("84","278").collect(Collectors.toSet()));
connections.put("149", Stream.of("162","207").collect(Collectors.toSet()));
connections.put("150", Stream.of("147","226").collect(Collectors.toSet()));
connections.put("151", Stream.of("49","258","60","196").collect(Collectors.toSet()));
connections.put("152", Stream.of("86").collect(Collectors.toSet()));
connections.put("153", Stream.of("154","246").collect(Collectors.toSet()));
connections.put("154", Stream.of("153","229","274").collect(Collectors.toSet()));
connections.put("155", Stream.of("224","283").collect(Collectors.toSet()));
connections.put("156", Stream.of("13","24","2","167","3","167","2","167").collect(Collectors.toSet()));
connections.put("157", Stream.of("23","232","13","29").collect(Collectors.toSet()));
connections.put("158", Stream.of("37","68").collect(Collectors.toSet()));
connections.put("159", Stream.of("143","277").collect(Collectors.toSet()));
connections.put("160", Stream.of("95","265").collect(Collectors.toSet()));
connections.put("161", Stream.of("25","44","25","44").collect(Collectors.toSet()));
connections.put("162", Stream.of("28","149").collect(Collectors.toSet()));
connections.put("163", Stream.of("11","82").collect(Collectors.toSet()));
connections.put("164", Stream.of("24","246","33","243","33","243").collect(Collectors.toSet()));
connections.put("165", Stream.of("93").collect(Collectors.toSet()));
connections.put("166", Stream.of("44","262","44","262").collect(Collectors.toSet()));
connections.put("167", Stream.of("14","156","14","156","14","156","13","188").collect(Collectors.toSet()));
connections.put("168", Stream.of("62","179","213").collect(Collectors.toSet()));
connections.put("169", Stream.of("239").collect(Collectors.toSet()));
connections.put("170", Stream.of("40","89").collect(Collectors.toSet()));
connections.put("171", Stream.of("61","135").collect(Collectors.toSet()));
connections.put("172", Stream.of("71","281").collect(Collectors.toSet()));
connections.put("173", Stream.of("16","98").collect(Collectors.toSet()));
connections.put("174", Stream.of("252").collect(Collectors.toSet()));
connections.put("175", Stream.of("252").collect(Collectors.toSet()));
connections.put("176", Stream.of("30","233").collect(Collectors.toSet()));
connections.put("177", Stream.of("105","238").collect(Collectors.toSet()));
connections.put("178", Stream.of("115","201").collect(Collectors.toSet()));
connections.put("179", Stream.of("168","180").collect(Collectors.toSet()));
connections.put("180", Stream.of("179","198").collect(Collectors.toSet()));
connections.put("181", Stream.of("76","112","285").collect(Collectors.toSet()));
connections.put("182", Stream.of("73","193").collect(Collectors.toSet()));
connections.put("183", Stream.of("42","43").collect(Collectors.toSet()));
connections.put("184", Stream.of("115","198").collect(Collectors.toSet()));
connections.put("185", Stream.of("236","280").collect(Collectors.toSet()));
connections.put("186", Stream.of("127","207","18","122","18","122").collect(Collectors.toSet()));
connections.put("187", Stream.of("57","231").collect(Collectors.toSet()));
connections.put("188", Stream.of("7","167").collect(Collectors.toSet()));
connections.put("189", Stream.of("30","131").collect(Collectors.toSet()));
connections.put("190", Stream.of("136","244").collect(Collectors.toSet()));
connections.put("191", Stream.of("196","211","28","258","107","276").collect(Collectors.toSet()));
connections.put("192", Stream.of("82","277","18","83","18","83","83","217").collect(Collectors.toSet()));
connections.put("193", Stream.of("5","182").collect(Collectors.toSet()));
connections.put("194", Stream.of("96","204").collect(Collectors.toSet()));
connections.put("195", Stream.of("105","112").collect(Collectors.toSet()));
connections.put("196", Stream.of("49","191","107","151").collect(Collectors.toSet()));
connections.put("197", Stream.of("271","272").collect(Collectors.toSet()));
connections.put("198", Stream.of("180","184").collect(Collectors.toSet()));
connections.put("199", Stream.of("269","288","269","288").collect(Collectors.toSet()));
connections.put("200", Stream.of("4","27","283","291").collect(Collectors.toSet()));
connections.put("201", Stream.of("178","281").collect(Collectors.toSet()));
connections.put("202", Stream.of("63","216").collect(Collectors.toSet()));
connections.put("203", Stream.of("32","246").collect(Collectors.toSet()));
connections.put("204", Stream.of("80","194").collect(Collectors.toSet()));
connections.put("205", Stream.of("137","143").collect(Collectors.toSet()));
connections.put("206", Stream.of("45","144").collect(Collectors.toSet()));
connections.put("207", Stream.of("149","186").collect(Collectors.toSet()));
connections.put("208", Stream.of("110","241").collect(Collectors.toSet()));
connections.put("209", Stream.of("75","290","75","234").collect(Collectors.toSet()));
connections.put("210", Stream.of("98","274").collect(Collectors.toSet()));
connections.put("211", Stream.of("11","191").collect(Collectors.toSet()));
connections.put("212", Stream.of("141").collect(Collectors.toSet()));
connections.put("213", Stream.of("53","168").collect(Collectors.toSet()));
connections.put("214", Stream.of("51","300").collect(Collectors.toSet()));
connections.put("215", Stream.of("41","275").collect(Collectors.toSet()));
connections.put("216", Stream.of("20","202").collect(Collectors.toSet()));
connections.put("217", Stream.of("192","282").collect(Collectors.toSet()));
connections.put("218", Stream.of("43","63").collect(Collectors.toSet()));
connections.put("219", Stream.of("134","221","134","221").collect(Collectors.toSet()));
connections.put("220", Stream.of("238","293").collect(Collectors.toSet()));
connections.put("221", Stream.of("75","219","75","219").collect(Collectors.toSet()));
connections.put("222", Stream.of("126","145").collect(Collectors.toSet()));
connections.put("223", Stream.of("95","259").collect(Collectors.toSet()));
connections.put("224", Stream.of("13","155","261","275","294").collect(Collectors.toSet()));
connections.put("225", Stream.of("127","295").collect(Collectors.toSet()));
connections.put("226", Stream.of("101","150").collect(Collectors.toSet()));
connections.put("227", Stream.of("294").collect(Collectors.toSet()));
connections.put("228", Stream.of("235","272","235","272").collect(Collectors.toSet()));
connections.put("229", Stream.of("154","240").collect(Collectors.toSet()));
connections.put("230", Stream.of("80","299").collect(Collectors.toSet()));
connections.put("231", Stream.of("9","187").collect(Collectors.toSet()));
connections.put("232", Stream.of("157","278").collect(Collectors.toSet()));
connections.put("233", Stream.of("1","176").collect(Collectors.toSet()));
connections.put("234", Stream.of("209","250").collect(Collectors.toSet()));
connections.put("235", Stream.of("99","228","99","228","99","146").collect(Collectors.toSet()));
connections.put("236", Stream.of("140","185").collect(Collectors.toSet()));
connections.put("237", Stream.of("61","120").collect(Collectors.toSet()));
connections.put("238", Stream.of("177","220").collect(Collectors.toSet()));
connections.put("239", Stream.of("59","169").collect(Collectors.toSet()));
connections.put("240", Stream.of("229","300").collect(Collectors.toSet()));
connections.put("241", Stream.of("208","264").collect(Collectors.toSet()));
connections.put("242", Stream.of("45").collect(Collectors.toSet()));
connections.put("243", Stream.of("164","294","164","294").collect(Collectors.toSet()));
connections.put("244", Stream.of("55","190","35","271").collect(Collectors.toSet()));
connections.put("245", Stream.of("113","280").collect(Collectors.toSet()));
connections.put("246", Stream.of("153","164","203","288").collect(Collectors.toSet()));
connections.put("247", Stream.of("272","284","272","284").collect(Collectors.toSet()));
connections.put("248", Stream.of("11","253").collect(Collectors.toSet()));
connections.put("249", Stream.of("13","48").collect(Collectors.toSet()));
connections.put("250", Stream.of("234","251").collect(Collectors.toSet()));
connections.put("251", Stream.of("5","250").collect(Collectors.toSet()));
connections.put("252", Stream.of("41","174","175").collect(Collectors.toSet()));
connections.put("253", Stream.of("94","248").collect(Collectors.toSet()));
connections.put("254", Stream.of("25","87","25","87").collect(Collectors.toSet()));
connections.put("255", Stream.of("68","88").collect(Collectors.toSet()));
connections.put("256", Stream.of("12","257").collect(Collectors.toSet()));
connections.put("257", Stream.of("59","256").collect(Collectors.toSet()));
connections.put("258", Stream.of("126","191","102","151").collect(Collectors.toSet()));
connections.put("259", Stream.of("26","223").collect(Collectors.toSet()));
connections.put("260", Stream.of("121","301").collect(Collectors.toSet()));
connections.put("261", Stream.of("224").collect(Collectors.toSet()));
connections.put("262", Stream.of("2","166","3","166").collect(Collectors.toSet()));
connections.put("263", Stream.of("8","139").collect(Collectors.toSet()));
connections.put("264", Stream.of("52","108","241","1","110").collect(Collectors.toSet()));
connections.put("265", Stream.of("160","302").collect(Collectors.toSet()));
connections.put("266", Stream.of("267").collect(Collectors.toSet()));
connections.put("267", Stream.of("129","266").collect(Collectors.toSet()));
connections.put("268", Stream.of("15","21").collect(Collectors.toSet()));
connections.put("269", Stream.of("78","199","78","199").collect(Collectors.toSet()));
connections.put("270", Stream.of("125","125").collect(Collectors.toSet()));
connections.put("271", Stream.of("197","244").collect(Collectors.toSet()));
connections.put("272", Stream.of("228","247","228","247","107","197").collect(Collectors.toSet()));
connections.put("273", Stream.of("26").collect(Collectors.toSet()));
connections.put("274", Stream.of("154","210").collect(Collectors.toSet()));
connections.put("275", Stream.of("215","224").collect(Collectors.toSet()));
connections.put("276", Stream.of("89","102","89","191").collect(Collectors.toSet()));
connections.put("277", Stream.of("159","192").collect(Collectors.toSet()));
connections.put("278", Stream.of("87","148","232","284","87","136","13").collect(Collectors.toSet()));
connections.put("279", Stream.of("62").collect(Collectors.toSet()));
connections.put("280", Stream.of("185","245").collect(Collectors.toSet()));
connections.put("281", Stream.of("144","172","94","201").collect(Collectors.toSet()));
connections.put("282", Stream.of("147","217").collect(Collectors.toSet()));
connections.put("283", Stream.of("155","200","291").collect(Collectors.toSet()));
connections.put("284", Stream.of("87","247","87","247","107","278").collect(Collectors.toSet()));
connections.put("285", Stream.of("72","181").collect(Collectors.toSet()));
connections.put("286", Stream.of("74","96").collect(Collectors.toSet()));
connections.put("287", Stream.of("93","301").collect(Collectors.toSet()));
connections.put("288", Stream.of("36","199","36","199","43","246").collect(Collectors.toSet()));
connections.put("289", Stream.of("94","142").collect(Collectors.toSet()));
connections.put("290", Stream.of("115","209").collect(Collectors.toSet()));
connections.put("291", Stream.of("42","200","283").collect(Collectors.toSet()));
connections.put("292", Stream.of("17","74").collect(Collectors.toSet()));
connections.put("293", Stream.of("220").collect(Collectors.toSet()));
connections.put("294", Stream.of("3","243","224","227","3","243").collect(Collectors.toSet()));
connections.put("295", Stream.of("76","225").collect(Collectors.toSet()));
connections.put("296", Stream.of("71","142").collect(Collectors.toSet()));
connections.put("297", Stream.of("113","137").collect(Collectors.toSet()));
connections.put("298", Stream.of("299").collect(Collectors.toSet()));
connections.put("299", Stream.of("230","298").collect(Collectors.toSet()));
connections.put("300", Stream.of("37","214","240").collect(Collectors.toSet()));
connections.put("301", Stream.of("260","287").collect(Collectors.toSet()));
connections.put("302", Stream.of("31","265").collect(Collectors.toSet()));
underground = new Graph<>(stations, connections);
routeFinder = new RouteFinder<>(underground, new HaversineScorer(), new HaversineScorer());
}
@Test
public void findRoute() {
List<Station> route = routeFinder.findRoute(underground.getNode("74"), underground.getNode("7"));
System.out.println(route.stream().map(Station::getName).collect(Collectors.toList()));
}
}

View File

@ -0,0 +1,42 @@
package com.baeldung.algorithms.astar.underground;
import java.util.StringJoiner;
import com.baeldung.algorithms.astar.GraphNode;
public class Station implements GraphNode {
private final String id;
private final String name;
private final double latitude;
private final double longitude;
public Station(String id, String name, double latitude, double longitude) {
this.id = id;
this.name = name;
this.latitude = latitude;
this.longitude = longitude;
}
@Override
public String getId() {
return id;
}
public String getName() {
return name;
}
public double getLatitude() {
return latitude;
}
public double getLongitude() {
return longitude;
}
@Override
public String toString() {
return new StringJoiner(", ", Station.class.getSimpleName() + "[", "]").add("id='" + id + "'")
.add("name='" + name + "'").add("latitude=" + latitude).add("longitude=" + longitude).toString();
}
}

View File

@ -29,6 +29,27 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.collections</groupId>
<artifactId>eclipse-collections</artifactId>
<version>10.0.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.collections</groupId>
<artifactId>eclipse-collections-api</artifactId>
<version>10.0.0</version>
</dependency>
</dependencies>
<build>
@ -42,6 +63,42 @@
<target>${maven.compiler.target.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${uberjar.name}</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.openjdk.jmh.Main</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
<filters>
<filter>
<!--
Shading signed JARs will fail without this.
http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
-->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
@ -50,6 +107,7 @@
<maven.compiler.target.version>11</maven.compiler.target.version>
<guava.version>27.1-jre</guava.version>
<assertj.version>3.11.1</assertj.version>
<uberjar.name>benchmarks</uberjar.name>
<jmh.version>1.22</jmh.version>
</properties>
</project>

View File

@ -0,0 +1,70 @@
package com.baeldung.benchmark;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.list.primitive.IntList;
import org.eclipse.collections.api.list.primitive.MutableIntList;
import org.eclipse.collections.impl.factory.primitive.IntLists;
import org.eclipse.collections.impl.list.mutable.FastList;
import org.eclipse.collections.impl.list.mutable.primitive.IntArrayList;
import org.openjdk.jmh.annotations.*;
import java.util.ArrayList;
import java.util.List;
import java.util.PrimitiveIterator;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Fork(2)
public class IntegerListFilter {
private List<Integer> jdkIntList;
private MutableList<Integer> ecMutableList;
private IntList ecIntList;
private ExecutorService executor;
@Setup
public void setup() {
PrimitiveIterator.OfInt iterator = new Random(1L).ints(-10000, 10000).iterator();
ecMutableList = FastList.newWithNValues(1_000_000, iterator::nextInt);
jdkIntList = new ArrayList<>(1_000_000);
jdkIntList.addAll(ecMutableList);
ecIntList = ecMutableList.collectInt(i -> i, new IntArrayList(1_000_000));
executor = Executors.newWorkStealingPool();
}
@Benchmark
public List<Integer> jdkList() {
return jdkIntList.stream().filter(i -> i % 5 == 0).collect(Collectors.toList());
}
@Benchmark
public MutableList<Integer> ecMutableList() {
return ecMutableList.select(i -> i % 5 == 0);
}
@Benchmark
public List<Integer> jdkListParallel() {
return jdkIntList.parallelStream().filter(i -> i % 5 == 0).collect(Collectors.toList());
}
@Benchmark
public MutableList<Integer> ecMutableListParallel() {
return ecMutableList.asParallel(executor, 100_000).select(i -> i % 5 == 0).toList();
}
@Benchmark
public IntList ecPrimitive() {
return this.ecIntList.select(i -> i % 5 == 0);
}
@Benchmark
public IntList ecPrimitiveParallel() {
return this.ecIntList.primitiveParallelStream().filter(i -> i % 5 == 0).collect(IntLists.mutable::empty, MutableIntList::add, MutableIntList::addAll);
}
}

View File

@ -0,0 +1,67 @@
package com.baeldung.benchmark;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.list.primitive.IntList;
import org.eclipse.collections.impl.list.mutable.FastList;
import org.eclipse.collections.impl.list.mutable.primitive.IntArrayList;
import org.openjdk.jmh.annotations.*;
import java.util.ArrayList;
import java.util.List;
import java.util.PrimitiveIterator;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Fork(2)
public class IntegerListSum {
private List<Integer> jdkIntList;
private MutableList<Integer> ecMutableList;
private ExecutorService executor;
private IntList ecIntList;
@Setup
public void setup() {
PrimitiveIterator.OfInt iterator = new Random(1L).ints(-10000, 10000).iterator();
ecMutableList = FastList.newWithNValues(1_000_000, iterator::nextInt);
jdkIntList = new ArrayList<>(1_000_000);
jdkIntList.addAll(ecMutableList);
ecIntList = ecMutableList.collectInt(i -> i, new IntArrayList(1_000_000));
executor = Executors.newWorkStealingPool();
}
@Benchmark
public long jdkList() {
return jdkIntList.stream().mapToLong(i -> i).sum();
}
@Benchmark
public long ecMutableList() {
return ecMutableList.sumOfInt(i -> i);
}
@Benchmark
public long jdkListParallel() {
return jdkIntList.parallelStream().mapToLong(i -> i).sum();
}
@Benchmark
public long ecMutableListParallel() {
return ecMutableList.asParallel(executor, 100_000).sumOfInt(i -> i);
}
@Benchmark
public long ecPrimitive() {
return this.ecIntList.sum();
}
@Benchmark
public long ecPrimitiveParallel() {
return this.ecIntList.primitiveParallelStream().sum();
}
}

View File

@ -0,0 +1,33 @@
package com.baeldung.benchmark;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class IntegerListFilterUnitTest {
private IntegerListFilter integerListFilter;
@Before
public void init() {
integerListFilter = new IntegerListFilter();
integerListFilter.setup();
}
@Test
public void whenBenchmarkIsExecute_thenJDKListsMustBeOfSameSize() {
assertEquals(integerListFilter.jdkList().size(), integerListFilter.jdkListParallel().size());
}
@Test
public void whenBenchmarkIsExecute_thenMutableListsMustBeOfSameSize() {
assertEquals(integerListFilter.ecMutableList().size(), integerListFilter.ecMutableListParallel().size());
}
@Test
public void whenBenchmarkIsExecute_thenPrimitiveListsMustBeOfSameSize() {
assertEquals(integerListFilter.ecPrimitive().size(), integerListFilter.ecPrimitiveParallel().size());
}
}

View File

@ -0,0 +1,33 @@
package com.baeldung.benchmark;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class IntegerListSumUnitTest {
private IntegerListSum integerListSum;
@Before
public void init() {
integerListSum = new IntegerListSum();
integerListSum.setup();
}
@Test
public void whenBenchmarkIsExecute_thenJDKListsMustHaveSameValue() {
assertEquals(integerListSum.jdkList(), integerListSum.jdkListParallel());
}
@Test
public void whenBenchmarkIsExecute_thenMutableListsMustHaveSameValue() {
assertEquals(integerListSum.ecMutableList(), integerListSum.ecMutableListParallel());
}
@Test
public void whenBenchmarkIsExecute_thenPrimitiveListsMustHaveSameValue() {
assertEquals(integerListSum.ecPrimitive(), integerListSum.ecPrimitiveParallel());
}
}

View File

@ -0,0 +1 @@
Sample file content

View File

@ -0,0 +1,31 @@
package com.baeldung.datetime;
import java.time.DayOfWeek;
import java.time.LocalDate;
public class AddSubtractDaysSkippingWeekendsUtils {
public static LocalDate addDaysSkippingWeekends(LocalDate date, int days) {
LocalDate result = date;
int addedDays = 0;
while (addedDays < days) {
result = result.plusDays(1);
if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
++addedDays;
}
}
return result;
}
public static LocalDate subtractDaysSkippingWeekends(LocalDate date, int days) {
LocalDate result = date;
int subtractedDays = 0;
while (subtractedDays < days) {
result = result.minusDays(1);
if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
++subtractedDays;
}
}
return result;
}
}

View File

@ -0,0 +1,27 @@
package com.baeldung.datetime;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import java.time.LocalDate;
public class AddSubtractDaysSkippingWeekendsUtilsUnitTest {
@Test
public void givenLocalDateAndDaysToAdd_thenAddDaysSkippingWeekends() {
LocalDate initialDate = LocalDate.of(2019, 11, 7);
LocalDate expectedDate = LocalDate.of(2019, 11, 13);
LocalDate result = AddSubtractDaysSkippingWeekendsUtils.addDaysSkippingWeekends(initialDate, 4);
assertEquals(expectedDate, result);
}
@Test
public void givenLocalDateAndDaysToSubtract_thenSubtractDaysSkippingWeekends() {
LocalDate initialDate = LocalDate.of(2019, 11, 7);
LocalDate expectedDate = LocalDate.of(2019, 11, 1);
LocalDate result = AddSubtractDaysSkippingWeekendsUtils.subtractDaysSkippingWeekends(initialDate, 4);
assertEquals(expectedDate, result);
}
}

View File

@ -2,6 +2,3 @@
### Relevant Articles:
- [Create a File in a Specific Directory in Java](https://www.baeldung.com/java-create-file-in-directory)
- [A Guide to the Java FileReader Class](https://www.baeldung.com/java-filereader)
- [The Java File Class](https://www.baeldung.com/java-io-file)
- [Java FileWriter](https://www.baeldung.com/java-filewriter)

View File

@ -0,0 +1,14 @@
## Core Java IO APIs
This module contains articles about core Java input/output(IO) APIs.
### Relevant Articles:
- [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream)
- [A Guide to the Java FileReader Class](https://www.baeldung.com/java-filereader)
- [The Java File Class](https://www.baeldung.com/java-io-file)
- [Java FileWriter](https://www.baeldung.com/java-filewriter)
- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library)
- [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](https://www.baeldung.com/java-path)
- [Quick Use of FilenameFilter](https://www.baeldung.com/java-filename-filter)
- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
- [Java Scanner](https://www.baeldung.com/java-scanner)

View File

@ -0,0 +1,40 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>core-java-io-apis</artifactId>
<version>0.1.0-SNAPSHOT</version>
<name>core-java-io-apis</name>
<packaging>jar</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../../parent-java</relativePath>
</parent>
<dependencies>
<!-- test scoped -->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>core-java-io-apis</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<properties>
<assertj.version>3.6.1</assertj.version>
</properties>
</project>

View File

@ -1,6 +1,8 @@
package com.baeldung.filereader;
import java.io.*;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class FileReaderExample {

View File

@ -1,11 +1,6 @@
package com.baeldung.stream;
package com.baeldung.outputstream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.io.*;
public class OutputStreamExamples {

View File

@ -0,0 +1,45 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacus enim, scelerisque id sapien ut, semper euismod quam. Nunc ullamcorper semper blandit. Praesent quis quam mollis, iaculis lectus a, fringilla leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vitae auctor mauris. Pellentesque eu pellentesque lorem, vel ultricies libero. Pellentesque vestibulum sagittis eros. In vestibulum lacus elit. Interdum et malesuada fames ac ante ipsum primis in faucibus.
Vivamus pharetra lacus fringilla nisl molestie eleifend. Donec et dolor non quam mattis mattis. Proin malesuada maximus elit id semper. Donec facilisis dolor ut feugiat auctor. Proin accumsan semper consectetur. Vivamus facilisis odio vel bibendum imperdiet. Sed rutrum nisi nec nisi interdum fringilla. Aliquam laoreet velit ullamcorper egestas ultrices. Aliquam ultricies sem sed orci interdum, eu porta purus malesuada. Sed accumsan, nunc ut maximus rhoncus, arcu ante pretium ex, non ultrices magna nisi et velit. Pellentesque tempor mi quis lacus consectetur, quis imperdiet enim efficitur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
Nunc sed maximus erat. Aenean imperdiet finibus massa ac aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis dignissim cursus purus, eu tempus urna. Nunc sed mauris scelerisque, luctus eros ut, viverra nisi. Maecenas congue sed ligula in eleifend. Praesent nec dignissim enim, dictum efficitur massa. Nullam eros dui, rutrum quis aliquam accumsan, sollicitudin cursus eros. Phasellus euismod, lorem vitae vehicula ullamcorper, leo lorem vestibulum magna, vitae malesuada libero ipsum id lorem. Aenean finibus turpis facilisis tortor bibendum, vitae dignissim dolor dictum. Ut quis ornare nisi, non rutrum sapien.
Etiam placerat, est eget placerat imperdiet, neque urna tristique est, a dictum nisl dolor vitae leo. Vivamus porttitor mi vitae volutpat ultrices. Quisque at ante porta mauris ultricies iaculis. Phasellus iaculis sollicitudin urna nec facilisis. Suspendisse dapibus vulputate scelerisque. Fusce felis diam, eleifend in tristique in, malesuada a purus. Suspendisse euismod ipsum sed urna imperdiet, quis venenatis lacus dapibus. Maecenas vitae est vel sem fringilla ornare at ut mi. Quisque porta, nulla at rutrum fringilla, mi ligula egestas libero, ac convallis elit diam et sapien. Vestibulum purus tortor, ornare ut enim sed, mattis lobortis erat. Maecenas ac ante tincidunt, euismod mauris a, fermentum diam. Nullam arcu est, consequat sed enim in, bibendum aliquet velit. Donec bibendum magna ac augue sagittis vehicula. Curabitur nec mauris eu augue bibendum volutpat. Fusce fringilla varius fringilla.
Aliquam faucibus massa non orci accumsan, porta consectetur diam vulputate. Nullam nec erat mollis, imperdiet libero nec, tincidunt neque. Aenean varius purus nec est auctor, sed vulputate libero varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vel neque elit. Donec vulputate fermentum nulla, ut aliquam neque tempor in. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel venenatis est. Suspendisse luctus elit quis dui dapibus, id sodales dolor cursus. Curabitur ut vehicula dui. Fusce aliquet est et ante feugiat, et tempus ex congue. Nunc eget dapibus leo. Nunc eu accumsan diam. Suspendisse risus eros, rutrum et volutpat in, consequat in nulla. Suspendisse id felis a orci accumsan iaculis.
Duis tincidunt diam eget tortor aliquet sodales. Etiam sodales purus ac urna mollis, et cursus enim porttitor. Nulla viverra ligula nunc, ornare condimentum felis posuere sed. Fusce aliquet pretium sagittis. Sed ac mi elementum massa dictum ornare. Integer quis dapibus lectus. Curabitur in rhoncus justo, et vulputate justo. Integer eget efficitur felis.
Sed finibus vel tortor ac egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vestibulum nulla mi, blandit efficitur sapien fermentum eu. Integer sed turpis eros. Phasellus sed aliquam ligula. Etiam dictum quam in dapibus mattis. Donec et tristique quam. Pellentesque gravida luctus dolor, eu ornare sapien. Donec justo ante, lacinia non sem et, ultricies dignissim nibh. Vivamus eu nisl et magna pulvinar efficitur. Sed at vehicula lectus, sit amet luctus sem. Morbi vehicula sapien nisi, nec sagittis orci vestibulum et.
Praesent non finibus diam. Quisque sit amet nisl vitae augue lobortis commodo. Morbi ullamcorper, tortor id ornare maximus, erat ipsum ullamcorper ipsum, in imperdiet diam sem vel erat. Sed pellentesque quis ex sed volutpat. Vestibulum volutpat diam ac dignissim sollicitudin. Praesent at luctus ex, at volutpat dui. Nunc nulla dui, lobortis et pharetra quis, efficitur in turpis. Donec sodales auctor purus id mollis. Sed auctor eu erat eget bibendum. Mauris tincidunt ornare neque id consequat. Suspendisse non massa ante. Quisque velit enim, rhoncus at erat eget, scelerisque placerat elit. Donec finibus luctus dolor. In sed eleifend lorem. Sed tempor ullamcorper lorem nec tristique. Fusce nec volutpat neque, id elementum est.
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum mattis elementum tellus, vitae maximus nulla eleifend ut. Vestibulum eu nibh vulputate, posuere felis eget, aliquet ex. Nullam leo ex, lacinia a ante ac, accumsan efficitur ligula. Vestibulum ornare gravida tempus. Proin rhoncus felis sit amet dolor commodo facilisis. Integer aliquet, diam sed pharetra feugiat, sem massa mollis orci, eget pretium libero nunc at quam. Ut rhoncus quam vitae massa hendrerit, ornare condimentum odio varius. Donec odio sapien, tristique eget libero ac, interdum facilisis odio. Phasellus nec mauris vel dolor semper mattis et quis ligula. Donec nec porttitor nunc. Integer maximus quam vitae sem gravida, ut commodo ex porttitor.
Sed cursus nisi turpis, vel laoreet massa blandit ut. Cras posuere velit nulla, nec pellentesque ipsum dignissim eget. Donec pharetra, ex et commodo viverra, leo dolor dapibus tellus, vel dignissim est sem ac lectus. Quisque a arcu dapibus, aliquet magna sed, rhoncus neque. Integer suscipit, nulla ac varius lacinia, orci metus scelerisque neque, a laoreet nibh risus vitae dolor. Pellentesque felis metus, pulvinar vel cursus id, ultrices non purus. Donec mi lectus, faucibus sit amet nunc at, sagittis pretium lectus. Fusce nec purus arcu. Mauris neque neque, blandit eget mi at, auctor tempus orci. Mauris sapien lorem, luctus nec tellus non, porttitor aliquam dui.
Mauris non ex risus. Aliquam imperdiet in eros eget placerat. Sed congue sed sapien porta sollicitudin. Phasellus tempor hendrerit metus vitae tincidunt. Suspendisse congue nisi sed augue dapibus, at pretium ante mollis. Cras non posuere nulla. Proin malesuada finibus magna vel iaculis. Cras in dapibus lorem. Pellentesque volutpat dolor sit amet magna tincidunt mollis. Nunc et lectus sodales, accumsan est vitae, ornare augue. Maecenas malesuada arcu leo, eget blandit lectus porttitor et. Nam aliquam sapien sit amet purus consequat lobortis. Aenean varius, augue porta dignissim efficitur, felis velit dapibus leo, tincidunt ultricies magna felis id ligula. Duis hendrerit, lectus eu elementum euismod, elit lectus consequat mi, sit amet egestas justo massa ut urna. Proin eleifend interdum ultrices.
Donec lacinia orci pharetra ornare tincidunt. Nulla facilisi. Maecenas malesuada dui ac elit sagittis tincidunt id dictum dolor. Quisque lobortis purus ac metus volutpat viverra. Proin finibus sapien ut odio semper consectetur. Sed gravida luctus egestas. Mauris pretium volutpat elit, at commodo arcu sagittis nec. Ut condimentum fringilla urna ac dignissim. Cras aliquam metus pulvinar, pulvinar nibh at, placerat arcu. Nulla ornare tortor sed lectus mollis, vitae fringilla tellus egestas. Vivamus efficitur tincidunt sapien, sed finibus mi congue eu. Nullam magna velit, lacinia vitae ligula eget, molestie consectetur felis. Suspendisse varius turpis orci, ac laoreet arcu accumsan sed. Fusce quis fermentum lacus, nec varius libero. Pellentesque ac odio ut justo lobortis elementum sit amet vehicula lorem. Nulla interdum nulla eget mi tristique, vitae egestas nunc egestas.
Curabitur commodo libero eu elit tincidunt, quis placerat risus vehicula. Vestibulum vehicula id nunc iaculis fermentum. Aenean semper, tellus ac semper rutrum, justo lorem feugiat leo, quis vulputate neque dui non ligula. Etiam egestas, enim eget tempor porta, nunc est tristique ante, vel suscipit massa lorem vel diam. Donec faucibus ante id turpis rhoncus congue. Nullam laoreet, diam efficitur scelerisque consequat, ligula leo ultrices est, non fermentum elit mauris ut dolor. Morbi non porttitor lorem. Sed volutpat sapien et lorem porttitor, ultricies ultricies tellus congue. Mauris sodales, tortor nec sagittis finibus, dui odio aliquet nibh, in luctus sapien massa eu risus. Nulla in est sed ante molestie vehicula vel nec lectus. Fusce maximus a quam eget aliquam. Vivamus pulvinar quis nisi a maximus. Proin cursus lacus sapien, et hendrerit elit pretium a. Donec tellus lectus, consectetur id dolor a, luctus rutrum libero. Suspendisse auctor scelerisque dui, nec pellentesque felis viverra nec. Cras elit ex, varius sed pulvinar sed, suscipit ultrices lacus.
Vivamus eu luctus lectus. Maecenas congue magna orci, quis semper nulla blandit vel. Phasellus dignissim risus placerat lacinia sagittis. Praesent at gravida nisi, at pulvinar diam. Nulla egestas lectus sed felis facilisis egestas. Curabitur posuere gravida urna eu vestibulum. Pellentesque at dolor gravida, placerat quam sit amet, fermentum ligula. Morbi fringilla, mi eget mollis dictum, neque dolor ullamcorper leo, a rutrum libero ipsum eget orci. Curabitur consectetur iaculis vestibulum. Suspendisse ultricies ligula et neque lacinia luctus. Sed dignissim neque id eros sollicitudin pellentesque.
Donec et magna quis lectus pharetra finibus a fringilla sapien. Phasellus accumsan, erat eu sodales cursus, tortor elit dapibus risus, ut ornare neque arcu in tellus. Nam ac vehicula diam, at aliquam nisl. Cras in sem eget nisi ultrices rutrum sit amet eu velit. Sed molestie tellus eget ante scelerisque, sit amet pulvinar neque fringilla. Nunc volutpat facilisis egestas. Cras sodales dui ac massa egestas, in mattis leo rhoncus. Pellentesque vitae urna vehicula ipsum sodales suscipit. Sed commodo tempus fringilla.
Etiam egestas elit vitae mi maximus fringilla quis eget libero. Fusce finibus ultrices tellus at molestie. Pellentesque posuere blandit elementum. Etiam eu erat eu urna hendrerit euismod. Nulla quis lectus rhoncus, ultricies urna eget, pretium neque. Cras sit amet ipsum sit amet purus rutrum ultricies nec vitae tortor. Sed tempor dapibus augue in pulvinar. Ut pretium sapien in malesuada accumsan. Donec eget ultrices erat, ut efficitur ligula. Sed posuere mauris est, nec convallis ipsum tempus non.
Duis a ullamcorper ante. Quisque eu ultricies metus, at aliquet odio. Nullam tempus molestie augue ut varius. Fusce purus eros, dictum nec finibus sed, sodales et diam. Suspendisse sed mi purus. Donec eleifend ipsum diam, nec fringilla enim laoreet non. Phasellus condimentum, magna sit amet porttitor suscipit, arcu risus lobortis dolor, ac fringilla nibh nisl vel purus. Phasellus facilisis posuere orci sit amet tempus. Nam nec enim maximus, rhoncus felis a, rutrum diam.
Suspendisse potenti. Donec vel tempor neque. In aliquet nulla in eleifend bibendum. Sed sapien sem, finibus in sodales vitae, euismod in sem. Phasellus nec elit a erat pulvinar semper. Aliquam luctus nisl in libero molestie aliquam. Nunc ac ornare felis. Ut non mauris ut ipsum rhoncus pretium. Curabitur tristique lacus a sagittis aliquam. Morbi vel volutpat tellus. Maecenas volutpat, lacus sed tempus imperdiet, eros tellus volutpat nisi, a egestas augue nulla quis arcu. In sollicitudin imperdiet efficitur. Suspendisse viverra aliquet nisi, congue ultrices arcu hendrerit in.
Maecenas vitae vestibulum nunc. Nullam semper faucibus tincidunt. Etiam sed hendrerit risus. Proin gravida, urna nec tincidunt tempus, nulla sapien porttitor nibh, porttitor lobortis nunc quam et tortor. Praesent ut varius lacus, ut hendrerit enim. Ut nec turpis ac felis imperdiet bibendum. Phasellus porttitor enim odio, et vehicula mi convallis vel. Quisque porta scelerisque sagittis. Praesent dignissim sagittis vulputate. Aenean non justo ac est volutpat bibendum. Aliquam mattis, sapien dapibus pellentesque semper, velit urna malesuada diam, nec varius nibh eros at erat. Proin leo ante, ultricies id velit ut, faucibus porta nibh. Sed nec fermentum urna, sed mollis leo. Aliquam erat volutpat.
Donec condimentum, urna sed hendrerit vestibulum, ante nibh lacinia dui, in tincidunt odio sem eget orci. In hac habitasse platea dictumst. Mauris id ex id ante tempus finibus eu sagittis erat. Quisque interdum urna risus, vel varius nibh euismod non. Nulla eget pellentesque quam. Aliquam vestibulum ac tortor non lobortis. Sed vitae erat sed libero dignissim dictum nec in turpis. Vivamus id ornare elit, ut facilisis lectus. Morbi dictum purus eget ipsum dignissim porttitor. Sed at vehicula purus, nec rhoncus quam. Nunc a nisl quis arcu blandit fermentum vel quis odio. Vivamus rhoncus, sapien sed lacinia hendrerit, velit urna fermentum dolor, id feugiat magna ligula sed urna. Proin euismod efficitur libero, eget porttitor lacus tempus quis. Duis tincidunt quis est a laoreet. Nam sit amet tristique nisl, sit amet mattis mi.
Aenean id dictum nulla, sed laoreet magna. Morbi consectetur in turpis at aliquam. Maecenas rutrum feugiat metus, at ullamcorper augue fermentum ut. Vivamus in magna pretium nibh dictum rhoncus luctus at orci. In hac habitasse platea dictumst. Fusce convallis, nulla nec hendrerit suscipit, ipsum diam lobortis sem, vitae elementum lectus erat sit amet magna. Quisque sollicitudin fringilla purus, ac molestie justo congue vitae. Nulla sapien leo, ullamcorper ac tellus in, cursus rhoncus enim. Suspendisse rutrum magna non ex elementum elementum id vitae enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare libero eu molestie pulvinar. Phasellus faucibus, magna eget rutrum porta, lorem turpis blandit lectus, eu viverra massa risus et ex.
Ut consectetur eros lacus, ac ullamcorper lacus mattis a. Cras congue justo ut erat interdum, et scelerisque nisi malesuada. Quisque sed sapien sollicitudin purus tincidunt finibus vestibulum vel dolor. Cras iaculis bibendum erat, a dictum urna viverra et. Integer non neque vulputate, tincidunt purus nec, rutrum arcu. Aliquam nec magna non sem semper laoreet quis at quam. Mauris dui lectus, convallis eu efficitur at, facilisis nec lorem. Cras felis sem, egestas ac rutrum vel, mollis et ex. Aenean semper egestas libero, nec commodo mi blandit efficitur. Duis nec quam in massa dignissim sagittis vel vitae leo. Nam molestie hendrerit auctor.
Sed suscipit egestas tellus sed cursus. Donec vel massa sit amet dui condimentum accumsan. Phasellus libero eros, lobortis a nisi id, porttitor maximus lectus. Praesent consectetur diam urna, id viverra turpis elementum in. Vivamus vitae pretium justo, nec tempor felis. Vivamus volutpat ultricies magna. Suspendisse vulputate lectus ac orci volutpat ullamcorper. Nulla eu leo pretium, commodo arcu accumsan, tempor nisl. Fusce sit amet tellus a ipsum vehicula laoreet sed vitae mauris. Duis porttitor massa mattis nibh placerat consequat. Fusce rutrum commodo tortor eget pellentesque. Suspendisse tempor enim libero, consequat dictum nibh dictum varius. Pellentesque feugiat sit amet urna sed facilisis. Curabitur a sagittis augue.

View File

@ -8,9 +8,7 @@ import java.io.StringReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.*;
public class BufferedReaderUnitTest {

View File

@ -8,7 +8,7 @@ import java.util.List;
import static org.junit.Assert.*;
public class FileClassDemoUnitTest {
public class FileClassUnitTest {
@Test
public void givenDir_whenMkdir_thenDirIsDeleted() {

View File

@ -1,4 +1,8 @@
package com.baeldung.file;
package com.baeldung.filenamefilter;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.File;
import java.io.FilenameFilter;
@ -7,10 +11,6 @@ import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public class FilenameFilterManualTest {
private static File directory;

View File

@ -1,6 +1,4 @@
package org.baeldung.java.io;
import static org.junit.Assert.*;
package com.baeldung.filepath;
import org.junit.AfterClass;
import org.junit.Assume;
@ -10,6 +8,8 @@ import org.junit.Test;
import java.io.File;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
public class JavaFilePathUnitTest {
private static String userDir;

View File

@ -1,19 +1,19 @@
package com.baeldung.filewriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class FileWriterExampleUnitTest {
@After
public void tearDown() throws IOException {
Files.delete(Path.of("src/test/resources/FileWriterTest.txt"));
Files.delete(Paths.get("src/test/resources/FileWriterTest.txt"));
}
@Test
@ -21,7 +21,7 @@ public class FileWriterExampleUnitTest {
try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) {
fileWriter.write("Hello Folks!");
}
Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt"))));
Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Paths.get("src/test/resources/FileWriterTest.txt"))));
}
@Test
@ -34,7 +34,7 @@ public class FileWriterExampleUnitTest {
fileWriter.write("Hello Folks Again!");
}
Assert.assertEquals("Hello Folks!" + "Hello Folks Again!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt"))));
Assert.assertEquals("Hello Folks!" + "Hello Folks Again!", new String(Files.readAllBytes(Paths.get("src/test/resources/FileWriterTest.txt"))));
}
@Test
@ -42,6 +42,6 @@ public class FileWriterExampleUnitTest {
try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) {
fileWriter.write("Hello Folks!".toCharArray());
}
Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt"))));
Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Paths.get("src/test/resources/FileWriterTest.txt"))));
}
}

View File

@ -1,12 +1,12 @@
package com.baeldung.stream;
package com.baeldung.outputstream;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
public class OutputStreamExamplesUnitTest {

View File

@ -1,20 +1,12 @@
package org.baeldung.java.io;
package com.baeldung.scanner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.*;
import java.util.Locale;
import java.util.Scanner;
import org.junit.Test;
import static org.junit.Assert.*;
public class JavaScannerUnitTest {

View File

@ -0,0 +1 @@
Hello, World!

View File

@ -0,0 +1 @@
Hello world

View File

@ -0,0 +1,9 @@
## Core Java IO Conversions
This module contains articles about core Java input/output(IO) conversions.
### Relevant Articles:
- [Java InputStream to String](https://www.baeldung.com/convert-input-stream-to-string)
- [Java Convert File to InputStream](https://www.baeldung.com/convert-file-to-input-stream)
- [Java Byte Array to Writer](https://www.baeldung.com/java-convert-byte-array-to-writer)
- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes)

View File

@ -0,0 +1,34 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>core-java-io-conversions</artifactId>
<version>0.1.0-SNAPSHOT</version>
<name>core-java-io-conversions</name>
<packaging>jar</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../../parent-java</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
</dependencies>
<build>
<finalName>core-java-io-conversions</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>

View File

@ -1,17 +1,16 @@
package org.baeldung.java.io;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
package com.baeldung.bytearraytowriter;
import com.google.common.io.CharSink;
import org.apache.commons.io.output.StringBuilderWriter;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.io.CharSink;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import static org.junit.Assert.assertEquals;
public class JavaXToWriterUnitTest {
protected final Logger logger = LoggerFactory.getLogger(getClass());

View File

@ -1,13 +1,8 @@
package org.baeldung.java.io;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
package com.baeldung.filetoinputstream;
import com.google.common.io.ByteSource;
import com.google.common.io.CharSource;
import com.google.common.io.Files;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.input.ReaderInputStream;
@ -15,9 +10,7 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.io.ByteSource;
import com.google.common.io.CharSource;
import com.google.common.io.Files;
import java.io.*;
public class JavaXToInputStreamUnitTest {
protected final Logger logger = LoggerFactory.getLogger(getClass());

View File

@ -1,4 +1,4 @@
package org.baeldung.java.io;
package com.baeldung.inputstreamtobytes;
import com.google.common.io.ByteSource;
import com.google.common.io.ByteStreams;

View File

@ -1,4 +1,4 @@
package org.baeldung.java.io;
package com.baeldung.inputstreamtostring;
import com.google.common.base.Charsets;
import com.google.common.io.ByteSource;

View File

@ -0,0 +1 @@
Hello World

View File

@ -4,30 +4,20 @@ This module contains articles about core Java input and output (IO)
### Relevant Articles:
- [How to Read a Large File Efficiently with Java](http://www.baeldung.com/java-read-lines-large-file)
- [Java InputStream to String](http://www.baeldung.com/convert-input-stream-to-string)
- [Java Write to File](http://www.baeldung.com/java-write-to-file)
- [Java Convert File to InputStream](http://www.baeldung.com/convert-file-to-input-stream)
- [Java Scanner](http://www.baeldung.com/java-scanner)
- [Java Byte Array to Writer](http://www.baeldung.com/java-convert-byte-array-to-writer)
- [Java Directory Size](http://www.baeldung.com/java-folder-size)
- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](http://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library)
- [File Size in Java](http://www.baeldung.com/java-file-size)
- [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](http://www.baeldung.com/java-path)
- [How to Copy a File with Java](http://www.baeldung.com/java-copy-file)
- [Java Append Data to a File](http://www.baeldung.com/java-append-to-file)
- [FileNotFoundException in Java](http://www.baeldung.com/java-filenotfound-exception)
- [How to Read a File in Java](http://www.baeldung.com/reading-file-in-java)
- [Zipping and Unzipping in Java](http://www.baeldung.com/java-compress-and-uncompress)
- [Quick Use of FilenameFilter](http://www.baeldung.com/java-filename-filter)
- [Read a File into an ArrayList](https://www.baeldung.com/java-file-to-arraylist)
- [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream)
- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension)
- [Getting a Files Mime Type in Java](http://www.baeldung.com/java-file-mime-type)
- [Create a Directory in Java](https://www.baeldung.com/java-create-directory)
- [How to Write to a CSV File in Java](https://www.baeldung.com/java-csv)
- [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files)
- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes)
- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
- [[More -->]](/core-java-modules/core-java-io-2)

View File

@ -1,140 +0,0 @@
package org.baeldung.java.io;
import org.apache.commons.io.FileUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystemException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import static org.junit.Assert.assertTrue;
public class JavaFileUnitTest {
private static final String TEMP_DIR = "src/test/resources/temp" + UUID.randomUUID().toString();
@BeforeClass
public static void setup() throws IOException {
Files.createDirectory(Paths.get(TEMP_DIR));
}
@AfterClass
public static void cleanup() throws IOException {
FileUtils.deleteDirectory(new File(TEMP_DIR));
}
@Test
public final void givenUsingJDK6_whenCreatingFile_thenCorrect() throws IOException {
final File newFile = new File(TEMP_DIR + "/newFile_jdk6.txt");
final boolean success = newFile.createNewFile();
assertTrue(success);
}
@Test
public final void givenUsingJDK7nio2_whenCreatingFile_thenCorrect() throws IOException {
final Path newFilePath = Paths.get(TEMP_DIR + "/newFile_jdk7.txt");
Files.createFile(newFilePath);
}
@Test
public final void givenUsingCommonsIo_whenCreatingFile_thenCorrect() throws IOException {
FileUtils.touch(new File(TEMP_DIR + "/newFile_commonsio.txt"));
}
@Test
public final void givenUsingGuava_whenCreatingFile_thenCorrect() throws IOException {
com.google.common.io.Files.touch(new File(TEMP_DIR + "/newFile_guava.txt"));
}
// move a file
@Test
public final void givenUsingJDK6_whenMovingFile_thenCorrect() throws IOException {
final File fileToMove = new File(TEMP_DIR + "/toMoveFile_jdk6.txt");
fileToMove.createNewFile();// .exists();
final File destDir = new File(TEMP_DIR + "/");
destDir.mkdir();
final boolean isMoved = fileToMove.renameTo(new File(TEMP_DIR + "/movedFile_jdk6.txt"));
if (!isMoved) {
throw new FileSystemException(TEMP_DIR + "/movedFile_jdk6.txt");
}
}
@Test
public final void givenUsingJDK7Nio2_whenMovingFile_thenCorrect() throws IOException {
final Path fileToMovePath = Files.createFile(Paths.get(TEMP_DIR + "/" + randomAlphabetic(5) + ".txt"));
final Path targetPath = Paths.get(TEMP_DIR + "/");
Files.move(fileToMovePath, targetPath.resolve(fileToMovePath.getFileName()));
}
@Test
public final void givenUsingGuava_whenMovingFile_thenCorrect() throws IOException {
final File fileToMove = new File(TEMP_DIR + "/fileToMove.txt");
fileToMove.createNewFile();
final File destDir = new File(TEMP_DIR + "/temp");
final File targetFile = new File(destDir, fileToMove.getName());
com.google.common.io.Files.createParentDirs(targetFile);
com.google.common.io.Files.move(fileToMove, targetFile);
}
@Test
public final void givenUsingApache_whenMovingFile_thenCorrect() throws IOException {
FileUtils.touch(new File(TEMP_DIR + "/fileToMove_apache.txt"));
FileUtils.moveFile(FileUtils.getFile(TEMP_DIR + "/fileToMove_apache.txt"), FileUtils.getFile(TEMP_DIR + "/fileMoved_apache2.txt"));
}
@Test
public final void givenUsingApache_whenMovingFileApproach2_thenCorrect() throws IOException {
FileUtils.touch(new File(TEMP_DIR + "/fileToMove_apache.txt"));
Files.createDirectory(Paths.get(TEMP_DIR + "/temp"));
FileUtils.moveFileToDirectory(FileUtils.getFile(TEMP_DIR + "/fileToMove_apache.txt"), FileUtils.getFile(TEMP_DIR + "/temp"), true);
}
// delete a file
@Test
public final void givenUsingJDK6_whenDeletingAFile_thenCorrect() throws IOException {
new File(TEMP_DIR + "/fileToDelete_jdk6.txt").createNewFile();
final File fileToDelete = new File(TEMP_DIR + "/fileToDelete_jdk6.txt");
final boolean success = fileToDelete.delete();
assertTrue(success);
}
@Test
public final void givenUsingJDK7nio2_whenDeletingAFile_thenCorrect() throws IOException {
Files.createFile(Paths.get(TEMP_DIR + "/fileToDelete_jdk7.txt"));
final Path fileToDeletePath = Paths.get(TEMP_DIR + "/fileToDelete_jdk7.txt");
Files.delete(fileToDeletePath);
}
@Test
public final void givenUsingCommonsIo_whenDeletingAFileV1_thenCorrect() throws IOException {
FileUtils.touch(new File(TEMP_DIR + "/fileToDelete_commonsIo.txt"));
final File fileToDelete = FileUtils.getFile(TEMP_DIR + "/fileToDelete_commonsIo.txt");
final boolean success = FileUtils.deleteQuietly(fileToDelete);
assertTrue(success);
}
@Test
public void givenUsingCommonsIo_whenDeletingAFileV2_thenCorrect() throws IOException {
FileUtils.touch(new File(TEMP_DIR + "/fileToDelete.txt"));
FileUtils.forceDelete(FileUtils.getFile(TEMP_DIR + "/fileToDelete.txt"));
}
}

View File

@ -0,0 +1,9 @@
## Core Java JAR
This module contains articles about JAR files
### Relevant Articles:
- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven)
- [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class)
- [Guide to Creating and Running a Jar File in Java](https://www.baeldung.com/java-create-jar)

View File

@ -0,0 +1,400 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>core-java-jar</artifactId>
<version>0.1.0-SNAPSHOT</version>
<name>core-java-jar</name>
<packaging>jar</packaging>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../../parent-java</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.unix4j</groupId>
<artifactId>unix4j-command</artifactId>
<version>${unix4j.version}</version>
</dependency>
<dependency>
<groupId>com.googlecode.grep4j</groupId>
<artifactId>grep4j</artifactId>
<version>${grep4j.version}</version>
</dependency>
<!-- web -->
<!-- marshalling -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- logging -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency> <!-- needed to bridge to slf4j for projects that use the log4j APIs directly -->
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${org.slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- test scoped -->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj-core.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.javamoney</groupId>
<artifactId>moneta</artifactId>
<version>${javamoney.moneta.version}</version>
</dependency>
</dependencies>
<build>
<finalName>core-java</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archiveBaseDirectory>${project.basedir}</archiveBaseDirectory>
<archive>
<manifest>
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>${maven-shade-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>${onejar-maven-plugin.version}</version>
<executions>
<execution>
<configuration>
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
<attachToBuild>true</attachToBuild>
<filename>${project.build.finalName}-onejar.${project.packaging}</filename>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot-maven-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>spring-boot</classifier>
<mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${exec-maven-plugin.version}</version>
<configuration>
<executable>java</executable>
<mainClass>com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed</mainClass>
<arguments>
<argument>-Xmx300m</argument>
<argument>-XX:+UseParallelGC</argument>
<argument>-classpath</argument>
<classpath />
<argument>com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed</argument>
</arguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>${maven-javadoc-plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>integration</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<excludes>
<exclude>**/*ManualTest.java</exclude>
</excludes>
<includes>
<include>**/*IntegrationTest.java</include>
<include>**/*IntTest.java</include>
</includes>
</configuration>
</execution>
</executions>
<configuration>
<systemPropertyVariables>
<test.mime>json</test.mime>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${exec-maven-plugin.version}</version>
<executions>
<execution>
<id>run-benchmarks</id>
<!-- <phase>integration-test</phase> -->
<phase>none</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>org.openjdk.jmh.Main</argument>
<argument>.*</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- java instrumentation profiles to build jars -->
<profile>
<id>buildAgentLoader</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>agentLoader</classifier>
<classesDirectory>target/classes</classesDirectory>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
<includes>
<include>com/baeldung/instrumentation/application/AgentLoader.class</include>
<include>com/baeldung/instrumentation/application/Launcher.class</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>buildApplication</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>application</classifier>
<classesDirectory>target/classes</classesDirectory>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
<includes>
<include>com/baeldung/instrumentation/application/MyAtm.class</include>
<include>com/baeldung/instrumentation/application/MyAtmApplication.class</include>
<include>com/baeldung/instrumentation/application/Launcher.class</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>buildAgent</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>agent</classifier>
<classesDirectory>target/classes</classesDirectory>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
<includes>
<include>com/baeldung/instrumentation/agent/AtmTransformer.class</include>
<include>com/baeldung/instrumentation/agent/MyInstrumentationAgent.class</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<properties>
<!-- util -->
<unix4j.version>0.4</unix4j.version>
<grep4j.version>1.8.7</grep4j.version>
<!-- testing -->
<assertj-core.version>3.10.0</assertj-core.version>
<!-- maven plugins -->
<javamoney.moneta.version>1.1</javamoney.moneta.version>
<maven-javadoc-plugin.version>3.0.0-M1</maven-javadoc-plugin.version>
<maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
<onejar-maven-plugin.version>1.4.4</onejar-maven-plugin.version>
<maven-shade-plugin.version>3.1.1</maven-shade-plugin.version>
<spring-boot-maven-plugin.version>2.0.3.RELEASE</spring-boot-maven-plugin.version>
<exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
</properties>
</project>

View File

@ -0,0 +1,5 @@
package com.baeldung.strictfpUsage;
public strictfp interface Circle {
double computeArea(double radius);
}

View File

@ -0,0 +1,12 @@
package com.baeldung.strictfpUsage;
public strictfp class ScientificCalculator {
public double sum(double value1, double value2) {
return value1 + value2;
}
public double diff(double value1, double value2) {
return value1 - value2;
}
}

View File

@ -0,0 +1,18 @@
package com.baeldung.strictfpUsage;
import org.junit.Test;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
public class ScientificCalculatorUnitTest {
@Test
public void whenMethodOfstrictfpClassInvoked_thenIdenticalResultOnAllPlatforms() {
ScientificCalculator calculator = new ScientificCalculator();
double result = calculator.sum(23e10, 98e17);
assertThat(result, is(9.800000230000001E18));
result = calculator.diff(Double.MAX_VALUE, 1.56);
assertThat(result, is(1.7976931348623157E308));
}
}

View File

@ -15,4 +15,5 @@ This module contains articles about Object-oriented programming (OOP) in Java
- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
- [Java Copy Constructor](https://www.baeldung.com/java-copy-constructor)
- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
- [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)

View File

@ -13,6 +13,4 @@ This module contains articles about Object-oriented programming (OOP) in Java
- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
- [Java Interfaces](https://www.baeldung.com/java-interfaces)
- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
- [Methods in Java](https://www.baeldung.com/java-methods)
- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2) [[More -->]](/core-java-modules/core-java-lang-oop-4)
- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)[[More -->]](/core-java-modules/core-java-lang-oop-4)

View File

@ -2,5 +2,8 @@
This module contains articles about Object-oriented programming (OOP) in Java
### Relevant Articles:
- [[<-- Prev]](/core-java-modules/core-java-lang-oop-3)
### Relevant Articles:
- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
- [Methods in Java](https://www.baeldung.com/java-methods)
- [Java private Access Modifier](https://www.baeldung.com/java-private-keyword)
- [[<-- Prev]](/core-java-modules/core-java-lang-oop-3)

View File

@ -1,3 +1,7 @@
## Core Java Operators
This module contains articles about Java operators
## Relevant Articles:
- [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator)
- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
@ -6,4 +10,5 @@
- [A Guide to Increment and Decrement Unary Operators in Java](https://www.baeldung.com/java-unary-operators)
- [Java Compound Operators](https://www.baeldung.com/java-compound-operators)
- [The XOR Operator in Java](https://www.baeldung.com/java-xor-operator)
- [Java Bitwise Operators](https://www.baeldung.com/java-bitwise-operators)

View File

@ -4,12 +4,12 @@ This module contains articles about Java syntax
### Relevant Articles:
- [Java private Access Modifier](https://www.baeldung.com/java-private-keyword)
- [Guide to Java Packages](https://www.baeldung.com/java-packages)
- [If-Else Statement in Java](https://www.baeldung.com/java-if-else)
- [Control Structures in Java](https://www.baeldung.com/java-control-structures)
- [Java Double Brace Initialization](https://www.baeldung.com/java-double-brace-initialization)
- [The Java Native Keyword and Methods](https://www.baeldung.com/java-native)
- [Variable Scope in Java](https://www.baeldung.com/java-variable-scope)
- [Introduction to Basic Syntax in Java](https://www.baeldung.com/java-syntax)
- [Java protected Access Modifier](https://www.baeldung.com/java-protected-access-modifier)
- [[<-- Prev]](/core-java-modules/core-java-lang-syntax)

View File

@ -4,7 +4,6 @@
- [Java Timer](http://www.baeldung.com/java-timer-and-timertask)
- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java)
- [Getting Started with Java Properties](http://www.baeldung.com/java-properties)
- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven)
- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
- [JVM Log Forging](http://www.baeldung.com/jvm-log-forging)
@ -21,24 +20,19 @@
- [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java)
- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid)
- [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle)
- [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class)
- [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler)
- [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object)
- [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions)
- [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception)
- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties)
- [Java Try with Resources](https://www.baeldung.com/java-try-with-resources)
- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class)
- [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding)
- [Graphs in Java](https://www.baeldung.com/java-graphs)
- [Read and Write User Input in Java](http://www.baeldung.com/java-console-input-output)
- [Formatting with printf() in Java](https://www.baeldung.com/java-printstream-printf)
- [Retrieve Fields from a Java Class Using Reflection](https://www.baeldung.com/java-reflection-class-fields)
- [Introduction to Basic Syntax in Java](https://www.baeldung.com/java-syntax)
- [Using Curl in Java](https://www.baeldung.com/java-curl)
- [Finding Leap Years in Java](https://www.baeldung.com/java-leap-year)
- [Java Bitwise Operators](https://www.baeldung.com/java-bitwise-operators)
- [Guide to Creating and Running a Jar File in Java](https://www.baeldung.com/java-create-jar)
- [Making a JSON POST Request With HttpURLConnection](https://www.baeldung.com/httpurlconnection-post)
- [How to Find an Exceptions Root Cause in Java](https://www.baeldung.com/java-exception-root-cause)
- [Convert Hex to ASCII in Java](https://www.baeldung.com/java-convert-hex-to-ascii)

View File

@ -0,0 +1,33 @@
package com.baeldung.digitalsignature;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
public class Utils {
private static final String STORE_TYPE = "PKCS12";
private static final char[] PASSWORD = "changeit".toCharArray();
private static final String SENDER_KEYSTORE = "sender_keystore.p12";
private static final String SENDER_ALIAS = "senderKeyPair";
public static final String SIGNING_ALGORITHM = "SHA256withRSA";
private static final String RECEIVER_KEYSTORE = "receiver_keystore.p12";
private static final String RECEIVER_ALIAS = "receiverKeyPair";
public static PrivateKey getPrivateKey() throws Exception {
KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
keyStore.load(new FileInputStream(SENDER_KEYSTORE), PASSWORD);
return (PrivateKey) keyStore.getKey(SENDER_ALIAS, PASSWORD);
}
public static PublicKey getPublicKey() throws Exception {
KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
keyStore.load(new FileInputStream(RECEIVER_KEYSTORE), PASSWORD);
Certificate certificate = keyStore.getCertificate(RECEIVER_ALIAS);
return certificate.getPublicKey();
}
}

View File

@ -0,0 +1,28 @@
package com.baeldung.digitalsignature.level1;
import com.baeldung.digitalsignature.Utils;
import javax.crypto.Cipher;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.PrivateKey;
public class DigitalSignatureWithMessageDigestAndCipherSigning {
public static void main(String[] args) throws Exception {
PrivateKey privateKey = Utils.getPrivateKey();
byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt"));
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] messageHash = md.digest(messageBytes);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] digitalSignature = cipher.doFinal(messageHash);
Files.write(Paths.get("target/digital_signature_1"), digitalSignature);
}
}

View File

@ -0,0 +1,33 @@
package com.baeldung.digitalsignature.level1;
import com.baeldung.digitalsignature.Utils;
import javax.crypto.Cipher;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.PublicKey;
import java.util.Arrays;
public class DigitalSignatureWithMessageDigestAndCipherVerifying {
public static void main(String[] args) throws Exception {
PublicKey publicKey = Utils.getPublicKey();
byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt"));
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] newMessageHash = md.digest(messageBytes);
byte[] encryptedMessageHash = Files.readAllBytes(Paths.get("target/digital_signature_1"));
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decryptedMessageHash = cipher.doFinal(encryptedMessageHash);
boolean isCorrect = Arrays.equals(decryptedMessageHash, newMessageHash);
System.out.println("Signature " + (isCorrect ? "correct" : "incorrect"));
}
}

View File

@ -0,0 +1,27 @@
package com.baeldung.digitalsignature.level2;
import com.baeldung.digitalsignature.Utils;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.PrivateKey;
import java.security.Signature;
public class DigitalSignatureWithSignatureSigning {
public static void main(String[] args) throws Exception {
PrivateKey privateKey = Utils.getPrivateKey();
Signature signature = Signature.getInstance(Utils.SIGNING_ALGORITHM);
signature.initSign(privateKey);
byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt"));
signature.update(messageBytes);
byte[] digitalSignature = signature.sign();
Files.write(Paths.get("target/digital_signature_2"), digitalSignature);
}
}

View File

@ -0,0 +1,28 @@
package com.baeldung.digitalsignature.level2;
import com.baeldung.digitalsignature.Utils;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.PublicKey;
import java.security.Signature;
public class DigitalSignatureWithSignatureVerifying {
public static void main(String[] args) throws Exception {
PublicKey publicKey = Utils.getPublicKey();
byte[] sig = Files.readAllBytes(Paths.get("target/digital_signature_2"));
Signature signature = Signature.getInstance(Utils.SIGNING_ALGORITHM);
signature.initVerify(publicKey);
byte[] messageBytes = Files.readAllBytes(Paths.get("src/test/resources/digitalsignature/message.txt"));
signature.update(messageBytes);
boolean isCorrect = signature.verify(sig);
System.out.println("Signature " + (isCorrect ? "correct" : "incorrect"));
}
}

View File

@ -0,0 +1 @@
This is a cool message!

View File

@ -421,6 +421,8 @@
<module>core-java-modules/core-java-concurrency-basic-2</module>
<module>core-java-modules/core-java-concurrency-collections</module>
<module>core-java-modules/core-java-io</module>
<module>core-java-modules/core-java-io-apis</module>
<module>core-java-modules/core-java-io-conversions</module>
<module>core-java-modules/core-java-io-files</module>
<module>core-java-modules/core-java-nio</module>
<module>core-java-modules/core-java-nio-2</module>
@ -433,6 +435,7 @@
<module>core-java-modules/core-java-lang-oop</module>
<module>core-java-modules/core-java-lang-oop-2</module>
<module>core-java-modules/core-java-lang-oop-3</module>
<module>core-java-modules/core-java-lang-oop-4</module>
<module>core-java-modules</module>
<module>core-java-modules/core-java-networking</module>
<module>core-java-modules/core-java-perf</module>
@ -447,6 +450,7 @@
<module>core-java-modules/core-java-string-apis</module>
<module>core-java-modules/core-java-strings</module>
<module>core-java-modules/core-java</module>
<module>core-java-modules/core-java-jar</module>
<module>core-java-modules/core-java-jvm</module>
<module>core-scala</module>
<module>couchbase</module>
@ -1198,6 +1202,8 @@
<module>core-java-modules/core-java-concurrency-basic-2</module>
<module>core-java-modules/core-java-concurrency-collections</module>
<module>core-java-modules/core-java-io</module>
<module>core-java-modules/core-java-io-apis</module>
<module>core-java-modules/core-java-io-conversions</module>
<module>core-java-modules/core-java-io-files</module>
<module>core-java-modules/core-java-nio</module>
<module>core-java-modules/core-java-nio-2</module>
@ -1210,6 +1216,7 @@
<module>core-java-modules/core-java-lang-oop</module>
<module>core-java-modules/core-java-lang-oop-2</module>
<module>core-java-modules/core-java-lang-oop-3</module>
<module>core-java-modules/core-java-lang-oop-4</module>
<module>core-java-modules</module>
<module>core-java-modules/core-java-networking</module>
<module>core-java-modules/core-java-perf</module>
@ -1639,6 +1646,7 @@
<module>parent-kotlin</module>
<module>core-java-modules/core-java</module>
<module>core-java-modules/core-java-jar</module>
<module>core-java-modules/core-java-concurrency-advanced</module> <!-- very long running? -->
<module>core-java-modules/core-java-concurrency-advanced-2</module>
<module>core-java-modules/core-java-concurrency-advanced-3</module>